MVVM nümunələrinin yaxşı nümunələri

Hal-hazırda Microsoft MVVM şablonu ilə işləyirəm və xəyal qırıqlığı vermək üçün ətraflı nümunələrin olmamasını tapıram. Aşağıdakı ContactBook nümunəsi çox az komanda işini göstərir və mən tapdığım başqa bir nümunə oxşar anlayışlara malik olan MSDN Magazine məqaləsidir, ancaq bir az fərqli yanaşma istifadə edir və hələ də çətinliyi yoxdur. Ən azı əsas CRUD əməliyyatları və informasiya / məzmunun köçürülməsini göstərən yaxşı MVVM nümunələri varmı?


Bütün təkliflər həqiqətən faydalı idi və mən yaxşı resursların siyahısını tərtib etməyə başlayacağam.

<strong> Çərçivələr / Nümunələr

Faydalı məqalələr

Screencasts

Əlavə kitabxanalar

129
02 нояб. jwarzech tərəfindən təyin 02 Noyabr. 2009-11-02 19:32 '09 da 19:32 'da 2009-11-02 19:32
@ 9 cavab

Təəssüf ki, hər şeyi edən bir böyük MVVM proqramı yoxdur və bir şey etmək üçün bir çox fərqli yanaşmalar var. Birincisi, ərizə infrastrukturlarından biri ilə tanış ola bilərsiniz (Prizma layiqli bir seçimdir), çünki onlar sizə lazım olan müxtəlif nümunələri asanlıqla sınamaq üçün asanlıqla inteqrasiya, komanda, tədbir toplama və s. uyğun,

Prizma azadlığı:
http://www.codeplex.com/CompositeWPF

Bu, kifayət qədər layiqli nümunə tətbiq (treyder), eləcə də bir çox kiçik nümunələr və onlardan istifadə etmək yollarını əhatə edir. Ən azından, bu insanlar MVVM yaratmaq üçün istifadə edən bir neçə ümumi subsets yaxşı bir nümayişdir. Hesab edirəm ki, onlar CRUD və dialoqlar üçün nümunələrə malikdirlər.

Hər bir layihə üçün prizma lazım deyil, ancaq bir-birini tanımaq yaxşıdır.

CRUD: Bu hissə olduqca sadədir, WPF-nin iki tərəfli əlaqələri ən çox məlumatı düzəldir. Real oyun, istifadəçi interfeysi özelleştirmesini basitleştiren bir model təmin etməkdir. Ən azından, ViewModel (və ya iş obyektiniz) INotifyPropertyChanged dəstəkləmək üçün INotifyPropertyChanged tətbiq INotifyPropertyChanged və xüsusiyyətləri birbaşa istifadəçi interfeyinə nəzarət edə biləcəyinizə əmin olmaq istəyirsən, ancaq doğrulama üçün IDataErrorInfo tətbiq edə bilərsiniz. Bir qayda olaraq, bir CRUD qurur bir növ ORM həll istifadə əgər, bu, asandır.

Bu məqalə sadə əməliyyatlar göstərir: http://dotnetslackers.com/articles/wpf/WPFDataBindingWithLINQ.aspx

LinqToSql üzərində qurulmuşdur, lakin bu nümunə ilə heç bir əlaqəsi yoxdur - işin obyektləri INotifyPropertyChanged (LinqToSql tərəfindən yaradılan siniflər) tətbiq edir. MVVM bu nümunənin nöqtəsi deyil, amma bu vəziyyətdə bunun əhəmiyyətli olduğunu düşünmürəm.

Bu məqalə məlumatların doğrulanmasını nümayiş etdirir.
http://blogs.msdn.com/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx

Yenə, ORM həllərinin çoxu IDataErrorInfo artıq həyata IDataErrorInfo siniflər yaradır və adətən xüsusi qiymətləndirmə qaydaları əlavə etmək üçün bir mexanizm təmin edir.

Çoğu halda, bəzi ORM tərəfindən yaradılmış bir obyekt (model) ala bilərsiniz və onu ehtiva ViewModel-də saxlaya və silmək üçün əmrləri - və interfeysi model xüsusiyyətlərinə birbaşa bağlamağa hazırsınız.

Görünüş bu kimi bir şeyə baxacaq (ViewModel bir model ehtiva edən Item mülkiyyətinə malikdir, məsələn, ORM-də yaradılmış bir sinifdir):

 <StackPanel> <StackPanel DataContext=Item> <TextBox Text="{Binding FirstName, Mode=TwoWay, ValidatesOnDataErrors=True}" /> <TextBox Text="{Binding LastName, Mode=TwoWay, ValidatesOnDataErrors=True}" /> </StackPanel> <Button Command="{Binding SaveCommand}" /> <Button Command="{Binding CancelCommand}" /> </StackPanel> 

Dialoqlar: Dialoqlar və MVVM bir az mürəkkəbdir. Mən "Broker" əleyhinə informasiya qutusunun ləzzətindən istifadə etməyi üstün tutur, StackOverflow bu məsələdə bu barədə bir az daha oxuya bilərsiniz:
WPF MVVM dialoq nümunəsi

Klassik MVVM olmayan mənim adi yanaşmam aşağıdakı kimi yekunlaşdırıla bilər:

Hərəkətlərin ələ alınması və aradan qaldırılması üçün əmrləri təmin edən ViewModel dialoqunun əsas sinifi, görünüşün dialoqun bağlanmasına hazır olduğunu bilmək üçün imkan verən bir hadisə və bütün informasiya qutularında lazım olan hər şeyi.

Sizin dialoqunuz üçün ümumi görünüş - bu bir pəncərə və ya xüsusi "modal" örtük növü ola bilər. Əslində, bu, görünmə modellərinə verdiyimiz və pəncərəni bağlamaq üçün kabellərin işlənməsini təmin edən bir məzmun təqdimatçısıdır - məsələn, data kontekstini dəyişdiyinizdə, yeni ViewModel sizin əsas sinifdən miras olub olmadığını yoxlaya bilərsiniz və əgər varsa, müvafiq yaxın hadisəyə (işləyən dialoqun nəticəsini təyin edəcək). Alternativ universal funksiyanı təmin etsəniz (məsələn, X düyməsini), siz də ViewModel-də müvafiq yaxın əmri çalıştırmalısınız.

Bir yerdə siz ViewModelsləriniz üçün məlumat şablonları təqdim etməlisiniz, xüsusilə də ayrı bir nəzarəti əhatə edən hər bir informasiya üçün görünüşünüz olduğundan çox sadə ola bilərlər. ViewModel üçün default data şablonu aşağıdakı kimi bir şeyə baxacaq:

 <DataTemplate DataType="{x:Type vmodels:AddressEditViewModel}> <views:AddressEditView DataContext={Binding} /> </DataTemplate> 

Əks halda ViewModel'i ümumi informasiya UI istisna olmaqla göstərmək üçün necə məlumat verə bilməyəcəyini, onun məzmunu əsasən belədir:

 <ContentControl Content={Binding} /> 

Gizli məlumat şablonu modeldə görünüşü göstərəcək, lakin kim onu ​​başlayacaq?

Bu qeyri-mvvm hissəsidir. Bunu etmək üçün bir yol küresel bir hadisə istifadə etməkdir. Hesab edirəm ki, asılılıq inteqrasiyası ilə təmin edilən tədbir toplayıcı növündən istifadə etmək yaxşıdır - belə ki, hadisə bütün tətbiq üçün yox, konteyner üçün qlobaldır. Prizma konteyner semantikası və asılılıq inteqrasiyası üçün vahid bir quruluş istifadə edir və ümumiyyətlə Birlik sevirəm.

Bir qayda olaraq, kök pəncərənin bu hadisəyə abunə olmağı vacibdir - bir dialoq aça bilər və məlumat kontekstini ViewModel-də quraşdırır, bu da hadisə ilə ötürüləcəkdir.

Bu metodu qurmaq, ViewModels-ə ərizə üçün istifadəçi interfeysi haqqında heç bir şey bilmədən bir əlaqə qutusu açmaq və orada istifadəçi hərəkətlərinə cavab verməsini təmin etməyə imkan verir, əksər hissəsi isə MVVM-ness üçün tam olaraq qalır.

Bununla belə, istifadəçi interfeysi bir az daha mürəkkəbləşdirə biləcək dialoqlar yaratmaq üçün vaxtlar var. Məsələn, əgər dialoqun mövqeyi onu açan düymənin yerindən asılı olsaydı. Bu halda, dialoqun açılmasını tələb edərkən istifadəçi interfeysi haqqında bəzi məlumatlara ehtiyacınız var. Mən bir ViewModel və bəzi müvafiq istifadəçi interfeysi məlumatlarını ehtiva edən ayrı bir sinif yaradır. Təəssüf ki, bir növ əlaqə var, qaçılmaz görünür.

Elementin mövqeyi məlumatına ehtiyacı olan dialoqa işarə edən düyməni işləyən pseudocode:

 ButtonClickHandler(sender, args){ var vm = DataContext as ISomeDialogProvider; // check for null var ui_vm = new ViewModelContainer(); // assign margin, width, or anything else that your custom dialog might require ... ui_vm.ViewModel = vm.SomeDialogViewModel; // or .GetSomeDialogViewModel() // raise the dialog show event } 

Əlaqə qutusu yer məlumatları ilə əlaqələndirir və daxil olan ViewModel'i daxili ContentControl . ViewModel özü hələ istifadəçi interfeysi haqqında heç bir şey bilmir.

Ümumiyyətlə, ShowDialog() metodunun DialogResult xüsusiyyətini istifadə etmir və ya ShowDialog() bloklanmasını gözləmirəm. Standart olmayan modal dialoq həmişə bu vəziyyətdə olduğu kimi işləmir və kompozit bir mühitdə bir hadisə işleyicisinin bu kimi bir şeyə mane olmasını istəmirsiniz. ViewModel-in yaradıcısı müvafiq hadisələrə abunə olmağı, öhdəlik / ləğv üsullarını və s. Təyin edə bilmək üçün ViewModels-i üstün tuturam. Beləliklə, bu istifadəçi interfeysi mexanizminə etibar etməyə ehtiyac yoxdur.

Beləliklə, bu mövzu:

 // in code behind var result = somedialog.ShowDialog(); if (result == ... 

Mən istifadə edirəm:

 // in view model var vm = new SomeDialogViewModel(); // child view model vm.CommitAction = delegate { this.DoSomething(vm); } // what happens on commit vm.CancelAction = delegate { this.DoNothing(vm); } // what happens on cancel/close (optional) // raise dialog request event on the container 

Mən bunu çox sevirəm, çünki dialoqlarımın əksəriyyəti qeyri-blocked pseudo-modal nəzarətdir və bu şəkildə bunu etmək daha sadə görünür. Asan vahid testi.

53
11 нояб. Cavab verilir Egor 11 noyabr. 2009-11-11 01:34 '09 at 1:34 pm 2009-11-11 01:34

Jason Dolinger MVVM-dən gözəl bir ekran çarx etdi. Yegorun dediyi kimi, yaxşı bir nümunə yoxdur. Bütün bitdi. Onların əksəriyyəti MVVM-in yaxşı nümunəsidir, ancaq çətin problemlər yarandıqda deyil. Hər kəsin öz yolu var. Laurent Bugnion baxış rejimi arasında ünsiyyət qurmağın yaxşı bir yoludur. Http://blog.galasoft.ch/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx Cinch də yaxşı bir nümunədir. Paul Stovel də Magellan çərçivəsini izah edən yaxşı bir post var .

border=0
6
13 нояб. Cavab 13 noyabr tarixində nportelli tərəfindən verilmişdir 2009-11-13 00:01 '09 at 0:01 2009-11-13 00:01

Bu faydalı bir tapıldı. Həmçinin kodu var.

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

3
24 апр. 24 Martda McBainUK tərəfindən verilmiş cavab 2010-04-24 18:19 '10 at 18:19 PM 2010-04-24 18:19

Caliburn'u izlədiniz mi? ContactManager misalında çox yaxşı şeylər var. Ümumi WPF nümunələri də əmrlərə yaxşı bir baxış təqdim edir. Sənədlər kifayət qədər yaxşıdır və forumlar aktivdir. Təklif olunan!

3
02 нояб. Cavab Andy S 02 noyabr tarixində verilir. 2009-11-02 20:14 '09 at 20:14 'da 2009-11-02 20:14

Cinch çərçivəsində nümunə layihə əsas CRUD və naviqasiya alətlərini göstərir. Bu, MVVM-nin istifadəsinin olduqca yaxşı bir nümunəsidir və onun istifadə və motivasiyasını izah edən çox hissəli məqaləni ehtiva edir.

2
02 нояб. Cavab Reed Copsey tərəfindən 02 Noyabr. 2009-11-02 19:44 '09 da 19:44 'da 2009-11-02 19:44

Mən də sizin xəyalınızı bölüşdüm. Mən ərizə yazıram və mən bu 3 tələbləri yerinə yetirdim:

  • Genişletilebilir
  • MVVM ilə WPF
  • GPL uyğun nümunələr

Mən tapdığım bütün bit idi, buna görə də yazılarımı mümkün qədər çox yazmağa başladım. Mənə bir az daxil olandan sonra, istinad materialından istifadə edən digər insanların (məsələn, özünüz) ola biləcəyini anladım, buna görə də paylaşılan materialları WPF / MVVM proqram mühitinə çevirmişdim və LGPL altında yayımladım. Mən SoapBox Core deyirdim . Yükləmə səhifəsinə gedin, kiçik bir demo tətbiqi ilə gəlir və bu demo tətbiq üçün mənbə kodu də yükləmək olar. Bu faydalı olduğunu ümid edirəm. Daha çox məlumat istəyirsinizsə, scott {at} soapboxautomation.com da mənə e-poçt at.

EDIT . Həmçinin necə işlədiyini izah edən bir məqalə CodeProject dərc etdi .

2
07 нояб. Cavab Scott Whitlock 07 noyabr tarixində verilir. 2009-11-07 06:42 '09 saat 06:42 'da 2009-11-07 06:42

Hətta öz əlimə işə baxana qədər xəyal qırıqlığını paylaşdım. IncEditor-a başladım.

IncEditor ( http://inceditor.codeplex.com ) WPF, MVVM və MEF-ə inkişaf etdirmək istəyən bir redaktordur. Mən başladım və mövzu dəstəyi kimi bəzi xüsusiyyətlərə sahib oldum. Mən WPF, MVVM və ya MEF üzrə mütəxəssis deyiləm, bir çox funksiyadan istifadə edə bilmirəm. Mən səmimiyyətlə sizdən daha yaxşı bir şey istəməyinizi xahiş edirəm ki, mənim kimi psycheslər daha yaxşı başa düşə bilərlər.

1
07 февр. Abdulsattar Mohammed tərəfindən verilmiş cavab 07 fevral. 2010-02-07 11:24 '10 at 11:24 2010-02-07 11:24

Burada hazırladığım MVVM arxitekturasını istifadə edən bir WPF proqram bağlantısı (inventar idarə tətbiqi) əlavə edirəm.

Onun istifadəçi interfeysi zəhmli. https://github.com/shivam01990/InventoryManagement

1
19 июля '14 в 13:44 2014-07-19 13:44 Cavab 19 İyul, '14 'də saat 13:44' də Shivam Srivastava tərəfindən verilmişdir 2014-07-19 13:44

Taslak kodunda sıfırdan basit bir MVVM örneği yazdım, burada MVVM WPF link adım adım . Sadə üç qatlı bir arxitektura ilə başlayır və PRISM kimi bəzi infrastrukturlardan istifadə etməyə imkan verir.

2019

0
20 окт. Cavab 20 oktyabrda Şivprasad Koirala tərəfindən verilir . 2014-10-20 19:44 '14 at 19:44 2014-10-20 19:44

tags ilə bağlı digər suallar və ya bir sual