MVVM'de, ViewModel və ya Model INotifyPropertyChanged tətbiq etməlidir?

Mən çalışdığım MVVM nümunələrinin əksəriyyətində, INotifyPropertyChanged modeli tətbiq edilmişdir, lakin məsələn, Josh Smith CommandSink ViewModel INotifyPropertyChanged tətbiq edir .

Mən hələ də MVVM konsepsiyalarını bilikcə toplayıram, buna görə bilmərəm:

  • CommandSink işini etmək üçün ViewModeldə INotifyPropertyChanged qoymalısınız
  • Bu, yalnız normanın aberrasiyasıdır və əhəmiyyətsizdir.
  • hər zaman INotifyPropertyChanged modelinin bir tətbiqinə sahib olmalısınız və bu tətbiqdə nümunə kodundan hazırlandığında müəyyənləşdiriləcək bir səhvdir

MVVM layihələrində çalışdığınız digər təcrübə nə idi?

129
21 апр. Edward Tanguay 21 apreldə təyin olundu 2009-04-21 14:57 '09 at 14:57 2009-04-21 14:57
@ 15 cavab

Mən tamamilə əksinə deyərdim: mənim ViewModel-də mənim INotifyPropertyChanged i həmişə qoydum - həqiqətən, INotifyPropertyChanged kimi xüsusi WPF funksiyasından istifadə edərək modelinizi çirkləndirmək INotifyPropertyChanged , bu material ViewModel-də oturmalıdır.

Əminəm ki, başqaları razılaşmayacaq, amma işləməyim.

79
21 апр. Steven Robbins tərəfindən verilmiş cavab Apr 21 2009-04-21 15:09 '09 at 15:09 2009-04-21 15:09

Modelin INotifyPropertyChanged tətbiq INotifyPropertyChanged üçün qətiliklə razı deyiləm. Bu interfeys xüsusi istifadəçi deyil! Sadəcə dəyişiklik barədə məlumat verir. Həqiqətən, WPF bu dəyişiklikləri müəyyən etmək üçün çox istifadə edir, ancaq bir interfeys interfeysi demək deyil. Mən bunu aşağıdakı şərh ilə müqayisə edəcəyəm: "Tire - avtomobil aksesuarı". Əlbəttə ki, bu doğrudur, lakin velosipedlər, avtobuslar və s. Həm də istifadə edin. Ümumiyyətlə, bu interfeys istifadəçi interfeysi kimi qəbul edilmir.

Sözündən sonra, bu, mütləq mən modelin verdiyi bildirişə inanıram. Əslində, bir qayda olaraq model zəruri deyilsə bu interfeysi tətbiq etməməlidir. Çox hallarda, server məlumatları müştəri tətbiqinə sığmazsa, model köhnəlmiş ola bilər. Lakin, maliyyə bazarının məlumatlarını dinləmək, modelin interfeysi niyə tətbiq edə bilməyəcəyini anlamıram. Bir nümunə olaraq, bir UI olmadan məntiqi varsa, məsələn, bir qiymətə təklif və ya soruşmaq qiyməti alırsa, bir xidmət kimi e-poçt vasitəsi ilə bir xəbərdarlıq verərsə və ya sifariş verərsə - bu, təmiz bir həll ola bilər.

Ancaq hər şeyə nail olmaq üçün fərqli yollar var, ancaq mən həmişə sadəlik lehinə fikirləşirəm və artıqlıqdan çəkinməyəcəyəm.

Hansı daha yaxşıdır? Bir görünüş modelində toplayaraq və ya dəyişən xarakterli hadisələri müəyyənləşdirmək və modelini və ya modelini (View-Model vasitəsilə) daxili olaraq yeniləyəcəyi haqda məlumatı yaymaq?

border=0

Biri gördüyünüz zaman "bu və ya edə bilməzsiniz" deyərkən, onlar nə danışdıqlarını bilmirlər.

Əslində, bu sizin biznesinizdən asılıdır və əslində MVVM bir çox problem ilə təməldir və mən board üzrə MVM MVMM tətbiqini görməmişəm.

MVVM'nin bir çox növünü və ümumi inkişaf problemlərini həll etmək üçün daha çox vaxt ayırdığımı diləyirəm, əksəriyyəti digər developers tərəfindən təmin edilmişdi, amma hesab edirəm ki, bunu başqa vaxt etmək lazımdır.

117
10 мая '10 в 19:49 2010-05-10 19:49 Paulo Sousa'ya 10 May 'da 10:10' da cavab verdi 2010-05-10 19:49

MV-VM-də ViewModel həmişə (model həmişə deyil) INotifyPropertyChanged

MV-VM layihə şablonu / toolkitini http://blogs.msdn.com/llobo/archive/2009/05/01/download-mv-vm-project-template-toolkit.aspx saytından yoxlayın. MV-VM layihələri üçün başlanğıc şablonu idarə etmək və idarə etmək üçün DelegateCommand əmrini istifadə edir.

24
04 мая '09 в 15:35 2009-05-04 15:35 cavab Soni Ali 04 May '09 saat 15:35 'da verilir. 2009-05-04 15:35

MVVM'nin çox pis adlandırıldığını və ViewModel ViewModel çağırışının bir çoxu, yaxşıca işlənmiş bir arxitekturanın əhəmiyyətli funksiyasını atmamağa səbəb olduğunu düşünürəm. Bu məlumatı idarə edən bir DataController, kimə toxunmağa çalışsa da.

Görünüş modelini bir DataControllerdən daha çox görsənməyiniz və DataControllerinizin data ilə məşğul olan yeganə element olan bir arxitektura tətbiq etməsinizsə, məlumatları birbaşa əlaqələndirməyəcəksiniz, həmişə DataController istifadə edin. DataController istifadəçi interfeysi üçün faydalıdır, ancaq yalnız istifadəçi interfeysi üçün deyil. Bu, biznes qatında, istifadəçi interfeysi qatında və s.

 DataModel -------- DataController ------ View / Business --------/ 

Nəticədə, belə bir modeli alacaqsınız. Hətta bir iş ViewModel istifadə edərək yalnız məlumatlarla əlaqəli olmalıdır. Sonra bulud yalnız uzaqlaşır.

8
01 янв. Cavab rhyo jan 01 tərəfindən verilir 2011-01-01 19:46 '11 saat 19:46 'da 2011-01-01 19:46

Bu, modelinizi necə tətbiq etdiyinizə bağlıdır. Şirkətim Lhotka CSLA-a oxşar biznes obyektlərini istifadə edir və bütün iş modelləri arasında İNotifyPropertyChanged-dən geniş istifadə edir.

Bizim qiymətləndirmə mexanizmi xüsusiyyətlərin bu mexanizm vasitəsilə dəyişdiyini bildirir və bu, çox yaxşı işləyir. Şübhəsiz, dəyişiklik bildirişinin əməliyyat üçün vacib deyil olduğu biznes obyektlərindən fərqli bir fərqli bir tətbiq istifadə edirsinizsə, iş modelinizdəki dəyişiklikləri aşkarlamaq üçün başqa metodlarınız ola bilər.

Lazım olduqda Modeldən yayılmış dəyişiklikləri nəzərdən keçirmək üçün modellərimiz var, lakin modeldə olan dəyişiklikləri izləyən modellər özləri də dinləyirlər.

7
21 апр. 21 Aprel Steve Mitcham'a cavab verdi 2009-04-21 15:55 '09 da 15:55 'da 2009-04-21 15:55

Lakin bəzən (bu təqdimatda, link mətnində olduğu kimi ) bir model İnternetdə bəzi məlumatlarla ərizə təqdim edən bir xidmətdir və sonra hadisələrdən istifadə edərək yeni məlumatın və ya məlumatın dəyişməsinin gəlməsi barədə bildirişi əlavə etməlisiniz ...

2
10 нояб. Andrey Khataev tərəfindən verilmiş cavab 10 Noyabr. 2009-11-10 17:07 '09 at 17:07 'da 2009-11-10 17:07

MV-VM ilə qalmaq istəyirsinizsə cavabı kifayət qədər aydın hesab edirəm.

bax: http://msdn.microsoft.com/en-us/library/gg405484(v=PandP.40).aspx

MVVM şablonundakı görünüş istifadəçi interfeysi və hər hansı bir istifadəçi interfeysi məntiqini əhatə edir, görünüş modeli məntiq və vəziyyəti mənimsəyir və model iş mantığını və məlumatlarını əhatə edir.

Görünüş modeli data məcburiyyəti, əmrlər və bildiriş dəyişiklikləri ilə görünüş modeli ilə qarşılıqlı əlaqədardır. Görünüş modelində görünüşdə göstərilmək üçün tələb olunan model yeniləmələrini tələb edir, izləyir və model yeniləmələrini düzəldir, çevirir, yoxlayır və yığır.

2
24 авг. John D 24 aug tərəfindən verilmiş cavab . 2013-08-24 09:46 '13 at 9:46 2013-08-24 09:46

Görünüşünüzdə deyərdim. Bu model bir hissəsidir, çünki model agnostikdir. Model, "işi agnostikdən azad edən hər şey" olmalıdır

2
21 апр. Steve Dunn tərəfindən cavab 21 Apre 2009-04-21 15:48 '09 saat 15:48 'da 2009-04-21 15:48

Hesab edirəm ki, hər şey istifadəyə bağlıdır.

Bir çox xüsusiyyətləri olan sadə modeliniz varsa, bunu INPC vasitəsilə həyata keçirə bilərsiniz. Sadə mən demək istəyirəm ki, bu model bir POCO kimi görünür.

Modeliniz daha mürəkkəbdirsə və interaktiv bir model ərazidə yaşayırsa - digər modellər hadisələrinə abunə olan modellərə istinadən modellər - INPC kimi tətbiq olunan model hadisələri ilə bir kabus.

Özünüzü bir sıra digər modellər ilə qarşılıqlı əlaqə yaratmaq üçün lazım olan bir neçə model şəxsin mövqeyinə qoyun. Abunə olmaq üçün müxtəlif tədbirləriniz var. Bütün bunlar INPC kimi həyata keçirilir. Hadisəni işləyənlər olduğunuzu düşünün. Bir ifası olan və / və ya clausses bir böyük şəlalə keçid.

INPC ilə bir problem. Uygulamalarınızı tətbiq etməyinizə deyil, soyutlamaya etibar etməlisiniz. Bu adətən interfeyslərdən istifadə edilir.

Eyni soyuducağın iki fərqli tətbiqinə nəzər salaq:

 public class ConnectionStateChangedEventArgs : EventArgs { public bool IsConnected {get;set;} } interface IConnectionManagerINPC : INotifyPropertyChanged { string Name {get;} int ConnectionsLimit {get;}  bool IsConnected {get;} } interface IConnectionManager { string Name {get;} int ConnectionsLimit {get;}  event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged; bool IsConnected {get;} } 

İndi hər ikisinə baxın. IConnectionManagerINPC nə deyir? Bəzi xüsusiyyətləri dəyişə bilər. Bunlardan hansılarını bilmirsiniz. Əslində, dizayn yalnız yalnız oxunuşlu olduğundan, yalnız IsConnected dəyişikliklərdir.

Əksinə, IConnectionManager niyyətləri aydındır: "Mən sizə deyə bilərəm ki, IsConnected əmlakın dəyəri dəyişə bilər."

1
19 февр. 19 Fevralda dzendras tərəfindən verilmiş cavab 2013-02-19 11:09 '13 at 11:09 2013-02-19 11:09

Yalnız modelində deyil, görünüş modelinizdə INotifyPropertyChange istifadə edin,

model tipik olaraq doğrulama hatalarını idarə etmək üçün IDataErrorInfo istifadə edir, belə ki, yalnız ViewModel modelinizdə saxlayın və MVVM yolunda doğrusınız.

1
30 нояб. Cavab Adam Nov 30 tərəfindən verilir 2011-11-30 14:48 '11 at 14:48 2011-11-30 14:48

Paulo'nun cavabı ilə razıyam, modellərdə INotifyPropertyChanged tətbiqi olduqca məqbuldur və hətta Microsoft tərəfindən təklif olunur -

Bir qayda olaraq, model forma məcburi asanlaşdırmaq üçün vasitələr həyata keçirir. Bu, adətən, INotifyPropertyChangedINotifyCollectionChanged istifadə edərək, kolleksiyanın mülkiyyət və dəyişiklik bildirişini INotifyCollectionChanged . Obyektlərin koleksiyasını təmsil edən sinif modellərinə, tipik olaraq, INotifyCollectionChanged tətbiqini təmin edən ObservableCollection<T> daxil INotifyCollectionChanged .

Bu cür tətbiqin istəmədiyini və ya həll etməyinizə qərar verməyinizə baxmayaraq, yadda saxlayın -

Model sinifləriniz tələb olunan interfeysləri tətbiq etmirsə?

Bəzən, INotifyCollectionChanged , IDataErrorInfo , IDataErrorInfo və ya INotifyDataErrorInfo işləməyən model obyektləri ilə INotifyDataErrorInfo . Bu hallarda, görünüş modeli, model obyektlərin sarılması və görünüş üçün lazımi xüsusiyyətləri təyin etmək üçün lazım ola bilər. Bu xüsusiyyətlərin dəyərləri birbaşa model obyektləri tərəfindən təmin edilməlidir. Görüntüləyici modeli, görünüşün asanlıqla məlumatları onlarla birləşdirə biləcəyini təmin edən xüsusiyyətlərə görə lazımi interfeysləri tətbiq edəcəkdir.

Alınan - http://msdn.microsoft.com/en-us/library/gg405484 ( PandP.40) .aspx

Mən modellərdə INotifyPropertyChanged tətbiq etmədiyimiz bəzi layihələrdə çalışdım və bununla əlaqədar bir çox problemlərə qaçdım; VM-də xüsusiyyətlərin lazımsız təkrarlanması zəruri idi və eyni zamanda BL / DL-ə keçməzdən əvvəl əsas obyekti (yenilənmiş dəyərlərlə) yeniləmək məcburiyyətində qaldı.

Xüsusilə, model obyektlərin toplusu (məsələn, bir redaktə şəffaf və ya siyahıda) və ya kompleks modellərlə işləməlisinizsə, problemlərlə qarşılaşacaqsınız; Model obyektləri avtomatik olaraq yenilənməyəcək və bütün bunları virtual maşınınızda idarə etməlisiniz.


Başlanğıcda başqa bir sual budur. Bu mövzuda heç bir məlumat yoxdur -

on123.ru.site/questions/45876 / ...

0
15 дек. cavab akjoshi 15 dekabr verilir . 2015-12-15 12:06 '15 'da 12:06' de, 2015-12-15 12:06

Normalda ViewModel INotifyPropertyChanged tətbiq INotifyPropertyChanged . Model hər hansı bir xml fayl, verilənlər bazası və hətta bir obyekt ola bilər. Model, görünüşü tətbiq edən viewmodelə ötürmək üçün istifadə olunur.

burada baxın

0
16 июля '11 в 5:33 2011-07-16 05:33 Cavab 16 iyul 2011-ci il tarixində saat 5:33 da Syed tərəfindən verilmişdir

Görünüşünüzdeki dəyişikliklərdən obyekt arayışını düşünün. Doğru dəyərləri göstərmək üçün yenilənməli olan bütün xüsusiyyətləri necə bildirirsiniz? Bir obyektin bütün xüsusiyyətləri baxımından OnPropertyChanged mənim baxımdan OnPropertyChanged .

Beləliklə, obyektin dəyəri əmlakın dəyərinin dəyişdirildiyi zaman kimsə bildirməsinə icazə vermək lazımdır və məncə, Object.Property1 , Object.Property2 və s. Kimi bağlamalar istifadə edirəm. Belə ki, yalnız mənim fikrimcə hazırda dəstəklənən obyektin dəyişdirilməsini istəyirsinizsə, OnPropertyChanged("Object") etmirəm.

Obyekt yüklənərkən yüzlərlə bildirişin qarşısını almaq üçün məndə xüsusi bir məntiqi göstərici var, yüklənərkən OnPropertyChanged olan OnPropertyChanged obyektindən yoxlanılır və heç bir şey yoxdur.

0
23 авг. cavab Dummy01 23 aug verilir . 2011-08-23 10:15 '11 saat 10:15 'da 2011-08-23 10:15

INotifyPropertyChange interfeysini istifadə edirəm. Əslində, model mülkiyyət dəyişikliyi yalnız istifadəçi interfeysi və ya xarici müştəri tərəfindən tetiklenmelidir.

Bir çox üstünlük və mənfi cəhətləri görmüşəm:

Faydaları

Notifier iş modelidir

  • Domenə görə bu doğru. O qaldırmaq üçün qərar verməlidir və olmadıqda.

Dezavantajlar

Modelin xüsusiyyətləri var (qty, dərəcəsi, Komissiya, totalfrieght). Totalfreeght miqdarı, dərəcəsi, komissiya dəyişikliyi istifadə edərək hesablanır.

  • Db-dən dəyərlər yüklənərkən, ümumi bayraq hesabı 3 dəfə (sayı, dərəcəsi, komissiya) adlanır. Bir dəfə olmalıdır.

  • İş qatında sürət, qty təyin edilirsə, başqa bir notifier çağırılır.

  • Bunu bəlkə də əsas sinifdə aradan qaldırmaq üçün bir seçim olmalıdır. Bununla birlikdə, inkişafçılar bunu edə bilmədi.

0
20 сент. Anand Kumar tərəfindən 20 Sentyabrda verilən cavab . 2011-09-20 20:49 '11 saat 20:49 'də 2011-09-20 20:49

imho, viewmodel INotifyPropertyChange tətbiq edir və model bildirişi başqa səviyyədə istifadə edə bilərəm.

Məsələn, bəzi sənəd xidməti və sənəd obyekti ilə, görünüşlü modeldən görünüşü təmizləmək və yenidən qurmağı dinləyən bir sənəd var. Viewmodel redaktorunda, görünüşləri dəstəkləmək üçün sənəd xüsusiyyətləri üçün bir dəyişiklik var. Xidmət xilas sənədlə (dəyişmə tarixini, son istifadəçi və s. Yenilənməsi) bir çox şey varsa, siz asanlıqla Ipropertychanged hadisələrin yüklənməsini ala bilərsiniz və yalnız sənədi dəyişdirməlisiniz.

Ancaq modelinizdə INotifyPropertyChange istifadə INotifyPropertyChange , məncə onu görünüşünüzə birbaşa yazmaq əvəzinə görünüş modelinizə keçirmək yaxşı bir təcrübədir. Bu halda, hadisələr modelinizdə dəyişikliyə gəldikdə, görünüş rejimini dəyişdirməlisiniz və görünüş bütöv olaraq qalır.

0
14 окт. Cavab Bram 14 oktyabr. 2011-10-14 08:01 '11 at 8:01 2011-10-14 08:01

bağlı digər suallar ya sual