绑定到List< string>时,如何使ListBox可编辑 [英] How to make ListBox editable when bound to a List<string>?
问题描述
编辑:基本问题是将List绑定到ListBox(或任何其他控件)。所以我正在编辑这个问题。
Edit: The basic problem is binding a List to ListBox(or any other control). So I am editing the question.
我将列表框绑定到ListBox,如下所示。但是,当我更改文本框的内容时,它不会更改源列表中的字符串。为什么?
I bound a list of string to a ListBox as below. However when I change the contents of the textbox it is not changing the string in the source list.Why?
public partial class MainWindow : Window
{
List<string> _nameList = null;
public List<string> NameList
{
get
{
if (_nameList == null)
{
_nameList = new List<string>();
}
return _nameList;
}
set
{
_nameList = value;
}
}
public MainWindow()
{
NameList.Add("test1");
NameList.Add("test2");
InitializeComponent();
}
而XAML
<ListBox Grid.Row="0" Grid.Column="0" DataContext="{Binding ElementName=main}" ItemsSource="{Binding NameList}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding .,Mode=OneWayToSource , UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
推荐答案
DataContext $每个
ListBoxItem
的c $ c>是字符串本身,因此绑定的路径为空(。
)。 TwoWay
和 OneWayToSource
绑定需要路径,因为您不能仅仅替换当前的 DataContext
。因此,您需要将字符串包装在将该字符串作为属性公开的对象中:
The DataContext
of each ListBoxItem
is the string itself, so the path of your binding is empty (.
). TwoWay
and OneWayToSource
bindings require a path, since you can't just replace the current DataContext
. So you need to wrap your string in an object that exposes the string as a property:
public class StringItem
{
public string Value { get; set; }
}
将字符串作为 StringItem
:
public partial class MainWindow : Window
{
List<StringItem> _nameList = null;
public List<StringItem> NameList
{
get
{
if (_nameList == null)
{
_nameList = new List<StringItem>();
}
return _nameList;
}
set
{
_nameList = value;
}
}
public MainWindow()
{
NameList.Add(new StringItem { Value = "test1" });
NameList.Add(new StringItem { Value = "test2" });
InitializeComponent();
}
并绑定到值
property:
And bind to the Value
property:
<ListBox Grid.Row="0" Grid.Column="0" DataContext="{Binding ElementName=main}" ItemsSource="{Binding NameList}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
请注意, StringItem
也需要实现 INotifyPropertyChanged
,以便绑定自动更新。您还应该将列表公开为 ObservableCollection< T>
而不是列表< T>
Note that StringItem
will also need to implement INotifyPropertyChanged
so that bindings are automatically updated. You should also expose the list as an ObservableCollection<T>
rather than a List<T>
这篇关于绑定到List< string>时,如何使ListBox可编辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!