ItemsControl与数据绑定ItemsSource和元素的双向绑定(可替换项目)
问题描述:
我有一个ObservableCollection对象(例如与第一个/姓氏的人),我想要在ItemsControl中显示。每个项目都显示在一个自定义的“编辑器”控件中,该控件允许编辑该对象的属性。 这部分工作正常,相当标准。ItemsControl与数据绑定ItemsSource和元素的双向绑定(可替换项目)
<ItemsControl ItemsSource="{Binding Persons}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<custom:PersonEditor Person="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是,自定义编辑控件也有可能取代被收到(而不是只需要编辑一个人的名字,一个新的Person对象代替它)的整个物体的能力。
我在寻找的是一种将这种改变推回到ObservableCollection的方法。就像现在一样,在编辑器中更改Person对象不会替换列表中的项目,这将是期望的结果。
任何帮助,将不胜感激。
答
如果您无权访问自定义控件,您可以尝试使用属性上的setter来清除ObservableCollection并重新添加项目,而不是直接替换它。
例如:
private ObservableCollection<MyModel> _dataSource;
public ObservableCollection<MyModel> DataSource
{
get
{
return _dataSource;
}
set
{
_dataSource.Clear();
foreach(var item in value)
{
_dataSource.Add(item);
}
}
}
这将阻止该项目本身得到替换导致与ItemSources问题,因为他们显然只能绑定到项目属性一次。
“他们显然只绑定到物品属性一次。”这不是我的经验。 –