2015-03-17 3 views
0

Я озадачен. Я пытаюсь использовать событие PropertyChanged от ObservableCollection, но компилятор не знает этого события. CollectionChanged он знает. MSDN говорит, что у ObservableCollection есть событие (https://msdn.microsoft.com/en-us/library/ms653376.aspx). Что я делаю не так?Нельзя использовать PropertyChanged from ObservableCollection

ObservableCollection<int> xx = new ObservableCollection<int>(); 
xx.PropertyChanged += (s, a) => { }; 
+2

ObservableCollection предназначен для мониторинга коллекций INotifyPropertyChanged для свойств. –

ответ

3

PropertyChanged является protected event, поэтому он не доступен из кода. Как вы точно знаете, protected означает, что он доступен только от самого себя и от производных классов.

Когда дело доходит до ObservableCollection, у нас есть событие CollectionChanged, чтобы знать, когда изменения коллекции (элемент был удален или добавлен). Если нам нужно знать, если элемент коллекции был изменен, вам нужно использовать пользовательскую реализацию, например, отсюда: TrulyObservableCollection

Также, как @O. R. Mapper правильно указал, что есть способ сделать это, не создавая производный тип. Поскольку ObservableCollection реализует INotifyPropertyChanged явно, вы должны указать экземпляр на интерфейс, а затем вы можете получить доступ к свойствам, событиям и методам интерфейса. Так что что-то подобное работает (но это некрасиво, если честно):

ObservableCollection<int> xx = new ObservableCollection<int>(); 
((INotifyPropertyChanged)xx).PropertyChanged += (s, a) => { }; 
+0

Я знал, но не заметил. Благодарю. –

+0

«вот почему он недоступен из вашего кода» - конечно, его все равно можно получить извне. Поскольку 'ObservableCollection ' реализует 'INotifyPropertyChanged', он должен предоставлять всем членам' INotifyPropertyChanged' общедоступным способом, в данном случае как [явная реализация интерфейса] (https://msdn.microsoft.com/en-us/ библиотека/bb460458.aspx). Следовательно, FWIW, '((INotifyPropertyChanged) xx) .PropertyChanged + = (s, a) => {};' все равно должен сделать трюк. Я не проверял, но я мог представить, что это событие даже уволено, например. когда свойство 'Count' изменяется. –

+0

@ O.R.Mapper, да, хотя это правда, это уродливо, черт возьми, и в некоторой степени обманывает это ... Но вы правы, это, вероятно, следует упомянуть в ответе. – walther

Смежные вопросы