Как получить уведомление, когда что-то меняется в окне WPF? - PullRequest
5 голосов
/ 03 марта 2011

У меня есть ObservableCollection, который связан с WPF ListView, и все значения отображаются правильно.Но как я могу получить уведомление, когда что-то, имеющее двустороннюю привязку, изменится?

Должен ли я использовать INotifyPropertyChanged так же, как в Winforms?Или есть более эффективные методы для этого?

Я видел некоторых людей, предлагающих использовать dependency properties онлайн, но не уверен, что именно так и следует делать.

Ответы [ 4 ]

4 голосов
/ 03 марта 2011

Если класс, к которому я хочу добавить свойство, это DependencyObject, я обычно добавляю DependencyProperty.Если классом является POCO (простые старые объекты clr), то я реализую INotifyPropertyChanged.

. В общем, все мои бизнес-объекты - это POCO, и поэтому я использую INotifyPropertyChanged.В мире WPF я в основном использую DependencyObjects (модели просмотра, пользовательские элементы управления, UserControls ...), и поэтому они являются DependencyProperties.Исключением являются модели представления, представляющие элементы (которые будут использоваться в качестве элементов в источнике элементов).В этом случае я думаю, что DependencyProperties не очень практичны (потому что Equals () и GetHashCode () из DependencyObjects запечатаны и DependencyObject зависит от потока).

Если ваш класс уже является DependencyObject, с использованием DependencyProperties может дать вам некоторые приятные преимущества : вам не нужно возвращать каждое значение, мощную систему наследования, значения по умолчанию,свойство изменяло обратные вызовы для свойства, приведение значения ... (мне нравится DependencyProperties, вероятно, больше, чем другим людям, которым они нравятся:)

Вывод: Основано на названии вашего вопроса: Какчтобы получить уведомление, когда что-то меняется в окне WPF? , я бы добавил DependencyProperty, а не свойство clr, потому что Window является DependencyObject.Кстати, в Visual Studio есть хороший фрагмент кода для создания DependencyProperties.

2 голосов
/ 03 марта 2011

На самом деле есть два сценария:

1) Уведомление пользовательского интерфейса об изменении части данных - либо в ViewModel, либо в модели, связанной с некоторыми элементами пользовательского интерфейса (обычно из-за привязки данных). В этом случае вы будете использовать INotifyPropertyChanged.

Пример: у вас есть объект Person, который связывает свое имя с TextBox. Человек должен реализовать INotifyPropertyChanged, и соответствующий код должен быть присоединен к установщику свойства имени.

2) Создание пользовательских элементов интерфейса, где вы хотите, чтобы данные были связаны. В этом случае вы будете использовать пользовательские свойства зависимостей.

Пример: у вас есть пользовательский элемент пользовательского интерфейса, который вращается при выполнении определенного условия. Таким образом, вы создаете свойство зависимостей IsSpinning, которое вы можете привязать к свойству IsLoading ViewModel. Затем пользовательский элемент управления использует свойство IsSpinning, чтобы изменить его поведение.

Надеюсь, это было ясно ...

1 голос
/ 03 марта 2011

Я обычно использовал INotifyPropertyChanged для своих объектов данных.

DependencyProperties можно реализовать только на элементах инфраструктуры, которые я считаю.

Редактировать: я забираю это обратно ... DependencyProperties может быть толькореализовано в DependencyObjects (FrameworkElement является примером этого, поскольку он происходит от UIElement, который происходит от Visual, который происходит от DependencyObject).

Если у вас есть UserControl, вы можете захотеть реализовать свойство Dependency, чтобы вы могли связыватьэто свойство (в XAML) к другому свойству.Вы не можете сделать этот сценарий с INotifyPropertyChanged.

1 голос
/ 03 марта 2011

Вы правы. Вы можете использовать INotifyPropertyChanged или вы можете реализовать свойства зависимости. Лично я предпочитаю INotifyPropertyChanged, он легче и проще в реализации, чем свойство зависимости.

...