ItemsControl с привязкой к данным ItemsSource и двусторонней привязкой элементов (заменяемые элементы)

У меня есть ObservableCollection объектов (например, люди с именем / фамилией), которые я хотел бы отобразить в ItemsControl. Каждый элемент отображается в пользовательском элементе управления "редактор", который позволяет редактировать свойства объекта. Эта часть работает нормально и довольно стандартно.

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

Тем не менее, пользовательский элемент управления редактора также имеет возможность заменить весь полученный объект (вместо того, чтобы просто редактировать имя человека, заменить его новым объектом лица).

То, что я ищу, - это способ вернуть это изменение обратно в ObservableCollection. Как и сейчас, изменение объекта Person в редакторе не заменяет элемент в списке, что приведет к желаемому результату.

Любая помощь будет оценена.

1 ответ

Если у вас нет доступа к самому пользовательскому элементу управления, вы можете использовать установщик свойства, чтобы очистить 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 только один раз.

Другие вопросы по тегам