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; }
}
Expose the strings as a list of 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();
}
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>
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>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…