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问题,因为他们显然只能绑定到项目属性一次。

+0

“他们显然只绑定到物品属性一次。”这不是我的经验。 –