ViewModel-də İNotifyPropertyChanged və ya DependencyProperty

Model-View-ViewModel arxitekturası üçün bir WPF proqramında ViewModel tətbiq edərkən, məlumatın necə bağlanacağı barədə iki əsas seçim var. Görünüşün bağlı olduğu xüsusiyyətlər üçün DependencyProperty istifadə edən INotifyPropertyChanged gördüm və INotifyPropertyChanged ViewModel INotifyPropertyChanged gördük.

Mənim sualım başqa birinə üstünlük verməməliyimmi? Hər hansı bir performans fərqi varmı? WPF üçün ViewModel asılılığını təmin etmək həqiqətən yaxşı bir fikirdirmi? Dizayn qərarını verərkən başqa nə düşünməməliyəm?

341
15 нояб. set bitbonk 15 noyabr. 2008-11-15 00:33 '08 saat 00:33 'da 2008-11-15 00:33
@ 14 cavab

Kent bu mövzuyla əlaqədar maraqlı bir blog yazdı: Modelləri Görüntüleme: POCOs və DependencyObjects .

Qısa təsviri:

  • DependencyObjects serializable kimi qeyd edilmir.
  • DependencyObject sınıfı, Equals () və GetHashCode () metodlarını yalnış və sıfırlar.
  • A DependencyObject mövzuların bənzərliyinə malikdir - yalnız yaradılan mövzuya daxil edilə bilər

Mən POCO yanaşmasını üstün tuturam. PresentationModel (aka ViewModel) üçün əsas sinif, INotifyPropertyChanged interfeysini tətbiq edir: http://compositeextensions.codeplex.com

205
23 апр. jbe 23 apreldə cavab verdi 2009-04-23 22:15 '09 at 10:15 PM 2009-04-23 22:15

WPF performans kitabçasına görə, DependencyObjects mütləq INotifyPropertyChanged tətbiq POCOs-dən daha yaxşı işləyir:

border=0

http://msdn.microsoft.com/en-us/library/bb613546.aspx

36
03 нояб. 03 noyabr Ceyms Ashley tərəfindən verilmiş cavab . 2010-11-03 19:45 '10 saat 19:45 'da 2010-11-03 19:45

Seçim tamamilə iş məntiqi və istifadəçi interfeysi abstraction səviyyəsi əsaslanır. Yaxşı bir ayrılma istəmirsinizsə, DP sizin üçün işləyəcək.

DependencyProperties, əsasən, VisualElements səviyyəsində tətbiq olunacaq, buna görə biz biznes ehtiyaclarımızın hər biri üçün bir çox DP yaratdığımız zaman yaxşı bir fikir olmaz. DP üçün INotifyPropertyChanged-dən daha yüksək qiymət. WPF / Silverlight'u yaratdığınızda, interfeys və ViewModel'i tamamilə düzəltməyə çalışın ki, istənilən vaxt layout və istifadəçi interfeysi elementlərini dəyişə bilərik (tema və üslub əsasında).

Bu yazıya da baxın - https://stackoverflow.com/questions/275098/what-applications-could-i-study-to-understand-datamodel-view-viewmodel . Bağlantı bu müzakirə üçün çox vacib olan Model-View-ViewModel şablonunun bir çox əlaqəsi var.

26
15 нояб. Jobi Joy Nov 15 tərəfindən verilmiş cavab 2008-11-15 01:22 '08 saat 01:22 2008-11-15 01:22

İfadə baxımından mən asılılıq xüsusiyyətlərindən istifadə edirəm və INotifyPropertyChanged düşüncəsində INotifyPropertyChanged . Tədbir abunəliyinə görə string xüsusiyyətlərin və mümkün yaddaş sızmalarının adlarına əlavə olaraq, INotifyPropertyChanged daha aydın mexanizmdir.

Asılılıq xüsusiyyətləri asanlıqla başa düşülmüş statik metadata istifadə edərək, "zaman, bunu et" deməkdir. Bu zəriflik üçün səsimi alan deklarativ yanaşma.

19
16 нояб. Cavab 16 noyabrda Bryan Watts tərəfindən verilir. 2008-11-16 02:35 '08 saat 02:35 'da 2008-11-16 02:35

INotifyPropertyChanged istifadə edildikdə, həmçinin INotifyPropertyChanged daha çox məntiq əlavə etmək imkanı verir.

DependencyProperty nümunəsi:

 public static DependencyProperty NameProperty = DependencyProperty.Register( "Name", typeof( String), typeof( Customer ) ); public String Name { set { SetValue( NameProperty, value ); } get { return ( String ) GetValue( NameProperty ); } } 

Getter və setterinizdə --- edə biləcəyiniz bütün parametrlər sadəcə SetValue və GetValue, b / c, getter / setter deyil ki, digər hissələrində zəng edir, bunun əvəzinə SetValue, GetValue, xüsusiyyətləri etibarlı şəkildə yerinə yetirilmir.

INotifyPropertyChanged ilə, hadisəni təsvir edin:

 public event PropertyChangedEventHandler PropertyChanged; 

Və sonra yalnız kodu hər hansı bir məntiq istifadə edin və sonra zəng:

 // ... // Something cool... // ... if( this.PropertyChanged != null ) { PropertyChanged( this, new PropertyChangedEventArgs( "Name" ) ); } // More cool stuff that will reliably happen... 

Bu, getter / setter və ya başqa yerdə ola bilər.

16
13 февр. cavab fevralın 13-də Adəm tərəfindən verilir . 2009-02-13 22:18 '09 at 10:18 pm 2009-02-13 22:18

Bağımlılık özellikleri, INotifyProperty'nin kullanıldığı veri bağlama kaynağı olaraq deyil, istifadəçi arayüzünün unsurlarına bağlanmayı (hedef olaraq) desteklemek üçün tasarlanmıştır. Saf baxımdan, ViewModels-də DP-dən istifadə etməməlisiniz.

"Müvəqqəti bir qaynaq olmaq üçün bir əmlakın müstəqillik hüququ olmaması, hər hansı bir CLR mülkiyyətini bağlama mənbəyi kimi istifadə edə bilər, lakin, bir bağlama obyekti olmaq üçün, mülkiyyət müstəqil mülk olmalıdır. Birtərəfli və ya iki tərəfli bağlamanın effektiv olması üçün, Mənbənin əmlakı bağlama sisteminə və dolayısı ilə hədəfə çatdırılan dəyişiklik bildirişlərini dəstəkləməlidir. CLR-nin xüsusi qaynaqları üçün bu əmlakın INotifyPropertyChanged dəstəyi. Koleksiyonlar INotifyCollectionChanged-i dəstəkləməlidir. "

Bütün asılılıq obyektləri serializə edilə bilməz (bu ViewModels və DTO (POCO) istifadə ilə müdaxilə edə bilər.

WPF ilə müqayisədə Silverlight-da DP arasında fərqlər var.

http://msdn.microsoft.com/en-us/library/cc221408(v=VS.95).aspx

http://msdn.microsoft.com/en-us/library/cc903933(VS.95).aspx

16
09 нояб. Nick Hermans tərəfindən verilmiş cavab 09 noyabr 2011-11-09 13:07 '11 at 13:07 2011-11-09 13:07

Mən də bu qərarı son vaxtlarda nəzərdən keçirməm lazım idi.

Mən INotifyPropertyChanged mexanizminin ehtiyaclarıma daha uyğun olduğunu tapdım, çünki mənim qrafik interfeyimi dövlətin təkrarlanmadan iş məntiqi mövcud strukturuna yapışmasına icazə verdilər. Mən istifadə etdiyim çərçivə öz müşahidəçi modelim idi və növbəti bir bildiriş səviyyəsinə köçürmək asan idi. Mənim iş məntiqi və INotifyPropertyChanged interfeysindən müşahidəçi interfeysini tətbiq edən bir sinif var idi.

DP ilə dövləti özünüzü saxlayan server müəyyən edə bilməzsiniz. Mən də bağlı olduğum hər bir dövlətin bir nüsxəsini önbelleğe almağa icazə vermək məcburiyyətindəyəm. Gərəksiz gəmi göründü - mənim vəziyyətim böyük və çətin idi.

Beləliklə, burada INotifyPropertyChanged bir GUI iş mantığından xüsusiyyətləri görüntüləmək üçün daha yaxşı tapdım.

Bu əmlakı dəyişdirmək üçün bir xüsusiyyət təyin etmək və digər GUI widgetlarını təsirləndirmək üçün xüsusi bir GUI widget lazım olduqda danışarkən, DP sadə bir həll etdi.

Beləliklə, DP'nin GUI bildirimi üçün GUI üçün faydalı olduğunu gördüm.

7
24 нояб. Cavab 24 noyabrda daha çoxu tərəfindən verilir 2008-11-24 20:16 '08 at 8:16 pm 2008-11-24 20:16

Bağımlılıkları WPF görünüş modunu vermək həqiqətən yaxşı bir fikirdir?

.NET 4.0 System.Xaml.dll olacaq, buna görə istifadə etmək üçün özbaşına quruluşa asılı olmayaraq. Rob Relay'ın PDC oturumu haqqında yazısına baxın .

Mənim qəbirəm

XAML obyektləri təsvir etmək üçün bir dildir və WPF, təsvir olunan obyektlərin istifadəçi interfeysi elementləri olduğu bir quruluşdur.

Onların əlaqələri C # -ə, mantığın təsviri dilinə və müəyyən məntiq tiplərini həyata keçirən bir çərçivədir. NET.

XAML-in məqsədi deklarativ obyektlərin qrafikidir. W * F texnologiyaları bu paradiqma üçün mükəmməl namizəddir, lakin XAML bunlardan asılıdır.

XAML və bütövlükdə asılılıq sistemi WF və WPF üçün ayrı-ayrı yığınlar kimi tətbiq olundu, ehtimal ki, müxtəlif qrupların təcrübələrini istifadəçilər arasında əlaqələr yaratmadan təcrübə ilə istifadə etmək olardı.

6
15 нояб. Cavab 15 noyabr Bryan Watts tərəfindən verilir 2008-11-15 02:17 '08 at 2:17 pm 2008-11-15 02:17

Hesab edirəm ki, DependencyProperty və INotifyPropertyChanged Binding-də iki fərqli şey üçün istifadə olunur: ilk əmlakı cəlb edən bir obyekt kimi açmaq və başqa əmlakdan giriş almaq (əmlakı təyin etmək üçün {Binding ...} istifadə edin), sonuncu dəyəri xüsusiyyətləri bağlama mənbəyi kimi istifadə edilmişdir (cildin ifadəində adı). Beləliklə, seçim yalnız texniki cəhətdir.

4
02 сент. Cavab verilir Domnik 02 Sentyabr. 2010-09-02 21:37 '10 at 21:37 'da 2010-09-02 21:37

Göründüyü kimi, yaratdığınız nəzarətlərdə, məsələn, düymələr kimi asılılıq xüsusiyyətləri istifadə edilməlidir. XAML-də xassələri istifadə etmək və bütün WPF funksiyalarını istifadə etmək üçün bu xüsusiyyətlər asılılıq xüsusiyyətlərinə malik olmalıdır.

Lakin, ViewModel INotifyPropertyChanged istifadə etmək daha yaxşıdır. İNotifyPropertyChanged istifadə edərək, ehtiyac duyarsanız, getter / setter mantığına sahib olmaq imkanı verəcəkdir.

Mən artıq İnotifyPropertyChanged tətbiq edən ViewModel üçün əsas sinifin Josh Smith versiyasını yoxlamağı məsləhət görürəm:

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

Hesab edirəm ki, bu ViewModel etmək üçün necə gözəl bir nümunədir.

4
25 марта '09 в 4:59 2009-03-25 04:59 25.03.2009- cu il saat 4: 59-da timothymcgrath tərəfindən cavab 2009-03-25 04:59

Depozit xüsusiyyətləri xüsusi bir nəzarət yaratmaq üçün yapışdırıcıdır. XAML inkişafı zamanı xassələrinizin xüsusiyyətləri penceresindəki xüsusiyyətlərinizi göstərmək üçün Intelli-mənada istifadə etmək istəyirsinizsə, Dependency xüsusiyyətlərindən istifadə etməlisiniz. INPC dizayn müddətində xüsusiyyətlər pəncərəsində heç bir əmlak göstərməyəcəkdir.

4
29 окт. John Peters tərəfindən verilmiş cavab Oct 29 2014-10-29 00:04 '14 'də 0:04 2014-10-29 00:04

DependencyObject səbəbi yalnız bir şey var - məcburi daha yaxşı işləyəcəkdir. Yalnızca INotifyPropertyChangedINotifyPropertyChanged ilə nümunə edin, siyahısı INotifyPropertyChanged vs əmlakından olan məlumatlarla doldurun INotifyPropertyChanged DependencyPropertyTextBox dan cari elementi redaktə edin ...

3
27 марта '11 в 23:18 2011-03-27 23:18 Cavab 27 aprel '13 'də saat 23:18' də verildi. 2011-03-27 23:18

İnotifyPropertyChanged olmadan Təqdimat Modelində yazdığım daha birbaşa yanaşma üstünlük verirəm . Data bağlama alternativindən istifadə edərək, birbaşa hesabat kodu olmadan CLR xüsusiyyətlərinə birbaşa bağlana bilərsiniz. Siz sadəcə bir sadə .NET mətn kodunu yazarkən yazırsınız və məlumat modeliniz dəyişdikdə yenilənir.

3
30 дек. Michael L Perry tərəfindən verilmiş cavab 30 Dek 2008-12-30 16:15 '09 saat 16:15 'da 2008-12-30 16:15

Xassələri digər nəzarətlərə çatdırmaq istəsəniz, Bağımlılığın xüsusiyyətlərini istifadə etməliyik ... Ancaq müvəffəqiyyətlər, çünki onlar anlamaq üçün vaxt ayırırlar ...

1
04 февр. Cavab JWP 04 fevralda verilir. 2011-02-04 00:05 '11 'də 0:05' da 2011-02-04 00:05