Принудительное обновление свойства зависимостей

Я хочу заставить привязку моего Listbox обновить его содержимое. Мой список ограничен свойством зависимости:

<ListBox ... DataContext="{Binding ElementName=_this}" ItemsSource="{Binding Path=MyList}"/>

Я хочу обновить содержимое списка, когда, например, я нажимаю кнопку таким образом, чтобы вызвать метод DependencyProperty MyList.


person Sean    schedule 06.06.2019    source источник


Ответы (2)


Вы можете сделать MyList ObservableCollection. или что-то еще, что реализует INotifyCollectionChanged

Затем, если вы изменили содержимое MyList, ListBox будет обновляться автоматически.

В этом случае вам даже не нужно объявлять MyList как свойство зависимостей. Достаточно простого свойства только для чтения:

public ObservableCollection<MyItem> MyList { get; }
    = new ObservableCollection<MyItem>();
person Chris Barber    schedule 06.06.2019

Используйте ObservableCollection< /a> в качестве контейнера для элементов, которые вы хотите отобразить в ListBox. Это автоматически вызовет обновление элемента управления при добавлении или удалении элементов.

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

Лично я бы абстрагировался от этого

private ObservableCollection<MyItem> _mylist = new  ObservableCollection<MyItem>();
public IEnumerable<MyItem> MyList => _mylist;

Чтобы обновить список...

_myList.Clear();
_mylist.Add( ... );

Элемент управления по-прежнему будет обновляться, так как он обнаруживает, что MyList реализует INotifyCollectionChanged, даже если он только что объявлен как IEnumerable.

Вы никогда не должны использовать DependencyProperty в качестве источника привязки данных — обычное свойство в сочетании с INotifyPropertyChanged является предпочтительным способом для любых свойств, которые обновляют свое значение. Взгляните на шаблон MVVM как на способ отделения пользовательского интерфейса от остального кода.

person Peregrine    schedule 06.06.2019