INotifyPropertyChanged по сравнению с DependencyProperty в ViewModel

349
задан lokusking 26 September 2016 в 21:32
поделиться

8 ответов

Кент написал интересный блог на эту тему: Просмотр моделей: POCO против объектов DependencyObjects .

Краткое резюме:

  1. Объекты DependencyObject не помечены как serializable
  2. Класс DependencyObject переопределяет и запечатывает Equals () и Методы GetHashCode ()
  3. DependencyObject имеет привязку к потоку - к нему можно получить доступ только на нити, на которой это было создал

Я предпочитаю подход POCO. Базовый класс для PresentationModel (он же ViewModel), который реализует интерфейс INotifyPropertyChanged, можно найти здесь: http://compositeextensions.codeplex.com

212
ответ дан 23 November 2019 в 00:28
поделиться

Я предпочитаю более прямой подход, о котором я вел блог в Модель Представления Без INotifyPropertyChanged. Используя альтернативу привязке данных, можно связать непосредственно со свойствами CLR без любого бухгалтерского кода. Вы просто пишете простой код.NET в своей Модели Представления, и это обновляется, когда Ваша Модель данных изменяется.

3
ответ дан Michael L Perry 23 November 2019 в 00:28
поделиться

это - действительно хорошая идея дать зависимости ViewModel WPF?

.NET 4.0 будет иметь System.Xaml.dll, таким образом, Вы не должны будете брать зависимость от произвольной платформы для использования ее. См. Rob Relyea сообщение о его сессии PDC.

Мое взятие

XAML является языком для описания объектов, и WPF является платформой, описанные объекты которой являются элементами UI.

Их отношения подобны C#, языку для описания логики и.NET, платформа, которая реализует конкретные виды логики.

целью XAML являются декларативные графы объектов. Технологии W*F являются великими кандидатами на эту парадигму, но XAML существует независимо от них.

XAML и вся система зависимости были реализованы как отдельные стеки для WF и WPF, вероятно, для усиления опыта различных команд, не создавая зависимость (никакая предназначенная игра слов) между ними.

6
ответ дан Bryan Watts 23 November 2019 в 00:28
поделиться

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

DependencyProperty пример:

public static DependencyProperty NameProperty = DependencyProperty.Register( "Name", typeof( String), typeof( Customer ) );

public String Name
{
    set { SetValue( NameProperty, value ); }
    get { return ( String ) GetValue( NameProperty ); }
}

В Вашем методе считывания и методе set---все можно сделать, просто назвать SetValue и GetValue соответственно, b/c в других частях платформы, которой не называют метод считывания/метод set, вместо этого это непосредственно называет SetValue, GetValue, таким образом, логика свойства не была бы надежно выполнена.

С INotifyPropertyChanged, определите событие:

public event PropertyChangedEventHandler PropertyChanged;

И затем просто имейте любую логику где угодно в Вашем коде, затем звоните:

// ...
// Something cool...
// ...

if( this.PropertyChanged != null )
{
    PropertyChanged( this, new PropertyChangedEventArgs( "Name" ) );
}

// More cool stuff that will reliably happen...

Это могло быть в методе считывания/методе set, или где-либо еще.

16
ответ дан Wilka 23 November 2019 в 00:28
поделиться

С точки зрения выразительности я полностью люблю использовать свойства зависимости и съеживаюсь при мысли INotifyPropertyChanged. Кроме string имена свойства и возможные утечки памяти из-за подписки события, INotifyPropertyChanged намного более явный механизм.

свойства Dependency подразумевают, "когда это, сделайте те" использующие понятные статические метаданные. Это - декларативный подход, который получает мой голос за элегантность.

19
ответ дан Bryan Watts 23 November 2019 в 00:28
поделиться

Выбор полностью основан на Вашей бизнес-логике и уровне абстракции UI. Если Вы не захотите хорошее разделение тогда, то DP будет работать на Вас.

DependencyProperties будет применим главным образом на уровне VisualElements, таким образом, это не будет хорошая идея, если мы создадим партию РАЗНОСТЕЙ ПОТЕНЦИАЛОВ для каждого из наших бизнес-требований. Также существует большая стоимость для DP, чем INotifyPropertyChanged. Когда Вы разрабатываете попытку WPF/Silverlight разработать UI и ViewModel, полностью отдельный так, чтобы в любом моменте времени мы могли изменить Расположение, и средства управления UI (На основе темы и Стилей)

Отсылают это сообщение также - https://stackoverflow.com/questions/275098/what-applications-could-i-study-to-understand-datamodel-view-viewmodel. Ссылка имеет много ссылки на шаблон Model-View-ViewModel, который очень относится к этому обсуждению.

27
ответ дан Community 23 November 2019 в 00:28
поделиться

Я также должен был недавно рассмотреть это решение.

я нашел, что механизм INotifyPropertyChanged удовлетворил моим потребностям лучше, потому что он позволил мне склеивать свой GUI к существующей платформе бизнес-логики, не копируя состояние. Платформа, которую я использовал, имела свой собственный шаблон "наблюдатель", и было легко передать один уровень уведомления на следующем. У меня просто был класс, который реализовал интерфейс наблюдателя от моей платформы бизнес-логики и интерфейс INotifyPropertyChanged.

С DP Вы не можете определить бэкенд, который хранит состояние сами. Я должен был бы позволить .net кэшу копия каждого объекта состояния, с которым я связывал. Это походило на ненужные издержки - мое состояние является большим и сложным.

, Таким образом, здесь я нашел INotifyPropertyChanged лучше для представления свойств с бизнес-логики на GUI.

, Что быть сказанным, где мне был нужен пользовательский виджет GUI для представления свойства и для изменений в том свойстве для влияния на другой DP виджетов GUI, доказало простое решение.

, Таким образом, там я нашел DP полезным для GUI к уведомлению о GUI.

7
ответ дан morechilli 23 November 2019 в 00:28
поделиться

Кажется, что Свойства Зависимости должны использоваться в средствах управления, которые Вы создаете, такие как Кнопки. Чтобы использовать свойства в XAML и использовать все функции WPF, те свойства должны Свойства Зависимости.

Однако Ваш ViewModel является более обеспеченным использованием INotifyPropertyChanged. Используя INotifyPropertyChanged даст Вам способность иметь логику метода считывания/метода set, если Вы должны будете.

Я рекомендую проверить версию Josh Smith базового класса для ViewModel, который уже реализует INotifyPropertyChanged:

http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/

Я думаю, что это - превосходный пример того, как сделать ViewModel.

4
ответ дан timothymcgrath 23 November 2019 в 00:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: