编辑:基本问题是将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();
}
和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>
答案 0 :(得分:13)
每个DataContext
的{{1}}是字符串本身,因此绑定的路径为空(ListBoxItem
)。 .
和TwoWay
绑定需要一个路径,因为您不能只替换当前的OneWayToSource
。因此,您需要将字符串包装在一个将字符串公开为属性的对象中:
DataContext
将字符串公开为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();
}
属性:
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>
还需要实现StringItem
,以便自动更新绑定。您还应该将列表公开为INotifyPropertyChanged
而不是ObservableCollection<T>
答案 1 :(得分:1)
也许有帮助?
<ListBox Name="lsbList">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Value}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 2 :(得分:0)
你可以使用itemscontrol和textboxes创建一个DataGridTemplateColumn.CellEditingTemplate来编辑你的项目
答案 3 :(得分:0)
如果我没有误解你的问题,那么很容易实现。看:
<ComboBox Text="My Comment 5 with addition." IsEditable="True" Height="25" Width="200">
<ComboBoxItem>My comment1</ComboBoxItem>
<ComboBoxItem>My comment2</ComboBoxItem>
</ComboBox>