我有一个ObservableCollection对象(例如具有名/姓的人),我想在ItemsControl中显示。每个项目都显示在自定义“编辑器”控件中,该控件允许编辑对象的属性。 这部分工作正常,相当标准。
<ItemsControl ItemsSource="{Binding Persons}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<custom:PersonEditor Person="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是,自定义编辑器控件还能够替换已接收的整个对象(而不仅仅是编辑一个人的名字,将其替换为新的人物对象)。
我正在寻找的是将此更改推回到ObservableCollection的方法。就像现在一样,在编辑器中更改Person对象不会替换列表中的项目,这将是期望的结果。
任何帮助都将不胜感激。
答案 0 :(得分:0)
如果您无法访问自定义控件本身,您可以尝试使用属性上的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出现问题,因为它们显然只绑定了items属性一次。