具有数据绑定ItemsSource的ItemsControl和元素的双向绑定(可替换项)

时间:2013-12-19 13:48:01

标签: wpf data-binding itemssource two-way

我有一个ObservableCollection对象(例如具有名/姓的人),我想在ItemsControl中显示。每个项目都显示在自定义“编辑器”控件中,该控件允许编辑对象的属性。 这部分工作正常,相当标准。

<ItemsControl ItemsSource="{Binding Persons}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <custom:PersonEditor Person="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

但是,自定义编辑器控件还能够替换已接收的整个对象(而不仅仅是编辑一个人的名字,将其替换为新的人物对象)。

我正在寻找的是将此更改推回到ObservableCollection的方法。就像现在一样,在编辑器中更改Person对象不会替换列表中的项目,这将是期望的结果。

任何帮助都将不胜感激。

1 个答案:

答案 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属性一次。