ПредишенСледващото

При осъществяването на ViewModel в WPF архитектура Model-View-ViewModel, изглежда, има два основни варианта за това как да се направи bindable до данните. Виждал съм реализации, които използват DependencyProperty за имоти, с които View е обвързан, и видях, че ViewModel прилагане INotifyPropertyChanged.

Въпросът ми е, когато трябва да се даде предимство на друг? Има ли някакви разлики в производителността? Наистина е добра идея да се даде ViewModel според WPF? Какво друго трябва да се вземат предвид при вземането на решения за проектиране?

  1. DependencyObjects не маркира като Serializable
  2. клас замени DependencyObject и уплътнения методи равнява () и GetHashCode ()
  3. В DependencyObject има нишка афинитет - достъп до нея е възможно само в поток, в който е бил създаден

Според ръководството на ефективност WPF, DependencyObjects определено работят по-добре, отколкото Pocos, че изпълнява INotifyPropertyChanged:

Изборът се основава изцяло на вашите бизнес логиката, нивото на потребителския интерфейс абстракции. Ако не искате добра сепарация след DP ще работи за вас.

DependencyProperties се прилага главно при ниво VisualElements, така че не е добра идея, ако създадем много DP за всеки един от нашите бизнес изисквания. Също така за DP-висока цена, отколкото INotifyPropertyChanged. Когато разработваме WPF / Silverlight, опитайте се да напълно да персонализирате интерфейса и ViewModel, така че по всяко време можем да променим интерфейсни елементи на оформлението и потребителски (въз основа на теми и стилове)

От гледна точка на изразителност аз старателно се забавлявахме с издръжка на имоти и раболепнича при мисълта за INotifyPropertyChanged. В допълнение към имената на свойствата низови и течове възможно паметта поради абонаменти за събития, INotifyPropertyChanged е много по-ясен механизъм.

Зависимост свойства предполагат ", когато това, направи това", използвайки лесно разбираем статично метаданни. Това декларативен подход, който получава моя глас за елегантност.

INotifyPropertyChanged, когато се използва също така дава възможност за добавяне на повече логика в кода на вашите привличат и тунера си свойства.

Във вашия кариерист и сетер --- всичко, което може да направите, е просто да се обадя SetValue и GetValue съответно, б / в в други части на рамката, която не се нарича кариерист / сетер, вместо това директно се обръща SetValue, GetValue, така че вашата логика свойства не е надеждно, изпълнявани.

С INotifyPropertyChanged функции определи събитието:

И след това просто да използвате всяка логика в кода си, а след това се обадете на:

Това може да бъде в приемателното / инкубатора или другаде.

Зависимост имоти са предназначени за подпомагане на свързването (като цел) към елементите на потребителския интерфейс, а не като източник на данни за свързване, това е INotifyProperty. С ясна гледна точка, не трябва да използвате ДП в ViewModels.

"За да бъде задължителен източник, имотът не трябва да бъде зависимостта имот, можете да използвате всеки CLR собственост като задължителен източник. Въпреки това, с цел да бъдат предмет на задължителен, имотът трябва да бъде зависим. Към едностранно или двустранно свързване да бъде ефективна, източник имот трябва да поддържа уведомление промени, които се простират към системата за свързване, а оттам и върху целта. За обичай CLR задължителен източник, това означава, че имотът трябва да поддържа INotifyPropertyChanged. Колекции трябва да подкрепят INotifyCollectionChanged. "

Всички зависими обекти не могат да бъдат поредица (това може да попречи на вашите ViewModels употреба и DTO (POCO).

Има разлика между ДП в Silverlight в сравнение с WPF.

Аз също трябваше да се помисли за това решение наскоро.

Открих, че механизмът INotifyPropertyChanged пригоден за нуждите ми по-добре, защото това ми позволи да залепите ми GUI към съществуваща структура на бизнес-логика, без да дублира състояние. Структурата, която аз използвах има свой модел наблюдател и че е лесно да се движат едно ниво към следващото известие. Току-що ми клас, който реализира интерфейса на наблюдател от моя бизнес-логика и INotifyPropertyChanged интерфейс.

С DP не можете да определите гръб, който съхранява състоянието на техните собствени. Аз ще трябва да кешира .net копие от всеки щат на елемента, към който бях вързан. Струваше ми се ненужно допълнително натоварване - ми състояние е голям и сложен.

Така че тук намерих INotifyPropertyChanged по-добре да се покажат свойствата на бизнес логиката на графичния потребителски интерфейс.

Говорейки за мястото, където е необходимо обичай GUI джаджа, за да изложи на имот и за промени в този имот да повлияе на други GUI джаджи, ДП се оказа просто решение.

Следователно, има Открих DP полезно за GUI за уведомяване GUI.

Наистина е добра идея да се даде ViewModel според WPF?

NET 4.0 ще бъде System.Xaml.dll, така че не трябва да зависи от всяка структура, за да го използвате. Cm. Post Роб Ralegh за PDC му сесия.

XAML - език за описание на обекти и WPF - структура, описана обекти са елементи на потребителския интерфейс.

Връзката им е подобен на C #, език за описване на логика и .NET, структура, която изпълнява определена логика.

Целта на XAML - това е декларативни графики обект. W * F технологии са големи кандидати за тази парадигма, но XAML съществува независимо от тях.

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

Изглежда, че за издръжка имоти трябва да се използват в контролите, които създавате, като копчета. За да използвате имоти в XAML и да използвате всички функции на WPF, тези имоти трябва да имат зависимост собственост.

Въпреки това, си ViewModel е по-добре да се използва INotifyPropertyChanged. Използването INotifyPropertyChanged ще ви даде възможност да има логика кариерист / сетер, ако имате нужда да.

Препоръчвам проверка Джош Смит версия на базовия клас за ViewModel, който вече изпълнява INotifyPropertyChanged:

Мисля, че това е чудесен пример за това как да се направи ViewModel.

Мисля, че на DependencyProperty и INotifyPropertyChanged използва за две различни неща в Обвързване: първият, който даде възможност на свойствата на двете котва и получаване на информация от друга собственост (използва се за задаване на имота), последният, когато искате стойността на имота е била използвана като задължителен източник (име в свързващ експресионни Path) условия. По този начин, изборът на технически.

Зависимост имоти - е лепилото, за да създадете потребителски контрол. Ако сте заинтересувани от използването на Intelli-смисъл на думата, за да покаже своите качества в прозореца Properties в развитието на XAML трябва да използвате свойствата на зависимост. INPC никога няма да покаже имота в прозореца на имоти по време на дизайн.

Ако искате да изложи свойства на други контроли, трябва да използвате свойствата на зависимост. Но късмет, защото е необходимо време, за да разбере.

Има само едно нещо, защо трябва да изберете DependencyObject - Свързването ще работи по-добре. Просто се опитай пример с ListBox и TextBox. попълни списъка с данни за свойствата на INotifyPropertyChanged и DependencyProperty и редактиране на текущия елемент на текстовото поле.

Подкрепете проекта - споделете линка, благодаря!