Jim*_*mmy 3 data-binding wpf listbox wpfdatagrid
编辑:基本问题是将List绑定到ListBox(或任何其他控件).所以我正在编辑这个问题.
我将一个字符串列表绑定到ListBox,如下所示.但是,当我更改文本框的内容时,它不会更改源列表中的字符串.为什么?
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();
}
Run Code Online (Sandbox Code Playgroud)
和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>
Run Code Online (Sandbox Code Playgroud)
Tho*_*que 14
在DataContext
每个ListBoxItem
是字符串本身,所以你的绑定的路径是空的(.
).TwoWay
和OneWayToSource
绑定需要一个路径,因为你不能只是替换当前DataContext
.因此,您需要将字符串包装在一个将字符串作为属性公开的对象中:
public class StringItem
{
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
将字符串公开为以下列表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();
}
Run Code Online (Sandbox Code Playgroud)
并绑定到Value
属性:
<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>
Run Code Online (Sandbox Code Playgroud)
请注意,StringItem
还需要实现INotifyPropertyChanged
以便自动更新绑定.您还应该将列表公开为ObservableCollection<T>
而不是List<T>