1

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

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

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

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

任何帮助,将不胜感激。

4

1 回答 1

0

如果您无权访问自定义控件本身,您可以尝试使用属性上的设置器来清除 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 属性一次。

于 2016-09-02T15:00:24.590 回答