Кент написал интересный блог на эту тему: Просмотр моделей: POCO против объектов DependencyObjects .
Краткое резюме:
Я предпочитаю подход POCO. Базовый класс для PresentationModel (он же ViewModel), который реализует интерфейс INotifyPropertyChanged, можно найти здесь: http://compositeextensions.codeplex.com
Я предпочитаю более прямой подход, о котором я вел блог в Модель Представления Без INotifyPropertyChanged. Используя альтернативу привязке данных, можно связать непосредственно со свойствами CLR без любого бухгалтерского кода. Вы просто пишете простой код.NET в своей Модели Представления, и это обновляется, когда Ваша Модель данных изменяется.
это - действительно хорошая идея дать зависимости ViewModel WPF?
.NET 4.0 будет иметь System.Xaml.dll, таким образом, Вы не должны будете брать зависимость от произвольной платформы для использования ее. См. Rob Relyea сообщение о его сессии PDC.
Мое взятие
XAML является языком для описания объектов, и WPF является платформой, описанные объекты которой являются элементами UI.
Их отношения подобны C#, языку для описания логики и.NET, платформа, которая реализует конкретные виды логики.
целью XAML являются декларативные графы объектов. Технологии W*F являются великими кандидатами на эту парадигму, но XAML существует независимо от них.
XAML и вся система зависимости были реализованы как отдельные стеки для WF и WPF, вероятно, для усиления опыта различных команд, не создавая зависимость (никакая предназначенная игра слов) между ними.
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, или где-либо еще.
С точки зрения выразительности я полностью люблю использовать свойства зависимости и съеживаюсь при мысли INotifyPropertyChanged
. Кроме string
имена свойства и возможные утечки памяти из-за подписки события, INotifyPropertyChanged
намного более явный механизм.
свойства Dependency подразумевают, "когда это, сделайте те" использующие понятные статические метаданные. Это - декларативный подход, который получает мой голос за элегантность.
Выбор полностью основан на Вашей бизнес-логике и уровне абстракции 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, который очень относится к этому обсуждению.
Я также должен был недавно рассмотреть это решение.
я нашел, что механизм INotifyPropertyChanged удовлетворил моим потребностям лучше, потому что он позволил мне склеивать свой GUI к существующей платформе бизнес-логики, не копируя состояние. Платформа, которую я использовал, имела свой собственный шаблон "наблюдатель", и было легко передать один уровень уведомления на следующем. У меня просто был класс, который реализовал интерфейс наблюдателя от моей платформы бизнес-логики и интерфейс INotifyPropertyChanged.
С DP Вы не можете определить бэкенд, который хранит состояние сами. Я должен был бы позволить .net кэшу копия каждого объекта состояния, с которым я связывал. Это походило на ненужные издержки - мое состояние является большим и сложным.
, Таким образом, здесь я нашел INotifyPropertyChanged лучше для представления свойств с бизнес-логики на GUI.
, Что быть сказанным, где мне был нужен пользовательский виджет GUI для представления свойства и для изменений в том свойстве для влияния на другой DP виджетов GUI, доказало простое решение.
, Таким образом, там я нашел DP полезным для GUI к уведомлению о GUI.
Кажется, что Свойства Зависимости должны использоваться в средствах управления, которые Вы создаете, такие как Кнопки. Чтобы использовать свойства в XAML и использовать все функции WPF, те свойства должны Свойства Зависимости.
Однако Ваш ViewModel является более обеспеченным использованием INotifyPropertyChanged. Используя INotifyPropertyChanged даст Вам способность иметь логику метода считывания/метода set, если Вы должны будете.
Я рекомендую проверить версию Josh Smith базового класса для ViewModel, который уже реализует INotifyPropertyChanged:
http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/
Я думаю, что это - превосходный пример того, как сделать ViewModel.