MVVM obrazac

poruka: 21
|
čitano: 6.585
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
offline
MVVM obrazac

Da zapocnem temu o MVVM obrascu gdje ce se nadam se podijeliti iskustva o njegovom koristenju u razvoju aplikacija.

 

Osobno mi se svidja kod njega sto za koristenje ne treba biti instaliran niti jedan framework ili toolkit, dovoljno je razumijeti kako se radi sa tim obrascem, a razvojna okolina (Silverlight u mojem slucaju jelte) vec ima sve spremno za njegovo koristenje: view.DataContext = new ViewModel();

 

Naravno, upotreba neke od brojnih biblioteka moze uvelike olaksati posao. Ja sam krenuo prvo sa MVVMLight, ali sam sada presao na Caliburn.Micro prvenstveno zbog "opinioned" pristupa, odnosno ugrađenih konvencija, i ViewModel-First pristupa. (PS moze se primjetiti kako .NETom sve više i više vladaju konvencije. Sve je bolje od XML konfiguracije!!)

 

Vaša iskustva?

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
MVVM obrazac

Evo radi ove teme otvorio profil :-) Usput, ovo je forum koji koristi Silverlight? Kako kul :-)

 

No, uglavnom ja trenutno koristim CSLA, NHibernate, Prism i Silverlight na nekim projektima.

 

CSLA ViewModel baznu klasu koristim kao osnovu za MVVM, ali nisam zadovoljan s tim rješenjem i zaključio sam da mi ne zadovoljava potrebe i samo overridam manje više sve iz te klase. Drugim riječima, trebao bi složiti neku svoju baznu klasu koja koristi CSLA.

 

Za upravljanje View-ovima i modulima koristim Prism navigaciju i Unity. Pristup podacima kroz NH, repository i unit of work. Podatkovni sloj komunicira s poslovnim preko dto objektima... i to je manje više to.

 

Ne držim se nikakvih posebnih MVVM standarda i najčešće instanciram VM u CB preko Unity, te ga pridružujem na DataContext. Kad rijuzam isti VM na različit V, koristim se presenter paternom. U poslovnom sloju, koji je realiziran u CSLA frameworku, mi se nalazi osnovna biz. logika, model, autentifikacija, validacija i sve potrebno da bi se podaci ispravno bindali unutar XAML-a.

 

Kako sam često isuviše lijen kreirati nove objekte u modelu, dosta logike pišem u VM, pa tako nastaju famozne klase od 1K linija koda :)

 

Poslovni sloj komunicira preko IoC-a i sučelja s podatkovnim i neovisan je o njegovoj implementaciji, znači olakšano je testiranje.

Forme u SL koriste isključivo VM, tako da je i tu olakšano testiranje, refactoring i sl.

CB koristim isključivo kad se radi kodu koji je vezan uz upravljanje sučeljem a da nema veza i logikom.

 

Na neki način objekti u BL su mi kockice koje onda povezujem u procese unutar VM.

Moj PC  
0 0 hvala 1
16 godina
offline
MVVM obrazac

Ja imam osobno nekoliko zahtjeva koje zelim da mi MVVM framework omoguci:

- automatsko spajanje View-a i ViewModela. Npr ako instanciram EmployeeViewModel, zelim da mi se automatski pokaze EmployeeView.xaml

- IoC/DI u konstruktoru VMa, preko MEFa, Unitya ili neceg treceg

- behaviori za bindanje evenata kontrola za metode VM-a

- automatsko bindanje nekih kontrola, npr: txtIme na public string Ime { get; set; }

- Messeging bus (event bus), ala mediator pattern (pisao o tome: http://www.hudosvibe.net/post/Slanje-poruka-unutar-Silverlight-aplikacije-pomocu-Mediator-patterna.aspx). Kada sam "otkrio" to, i maknuo tonu pretplata na evente, jako sam pojednostavio aplikaciju. Totalni must-have

- Caliburn.Micro ima sve ovo gore.

 

WCF, konverzija DTO sa automapper ili rucno, sve to standardno ide u paketu. Prije sam se dosta pridrzavao pravila kreiranje repozitorija, service layera za BLL, application layera sa web servisima, ali nikada nisam u biti vidio neku koristo od toga, samo nepotrebni layeri, a aplikacije nisu bile toliko velike. 

 

Sada se vise okrecem nekom pub/sub modelu rada cijele app: citanje podataka mora biti jednostavno, iz vec nekog denormaliziranog modela ili pomocu NH projekcija, ali bitno da se vrlo lako moze doci do podataka iz baze, bez komplikacija i 5 layera.

Zadatke vezane uz poslovnu logiku, nekakvo racunanje, poslovna pravila, upakiram u posebne klase (u service layeru recimo), koje pozivam preko pub/sub mehanizma - to se zovu komande. Npr imam AddProductToBasketCommandDTO koji sadrzi samo potrebne informacije (ProductID, UserID), a za tu komandu imam registriran handler. Kod buduceg skaliranja aplikacije lako je grupirati logiku, i primjeniti neki asinkroni messeging bus i SOA arhitekturu, a da se zadrze odlicne perfomanse (async queue).

U biti ovdje pricam o CQRS patternu... a jednog ljepog dana bi htio probati primjeniti i event sourcing pattern - totalna alternativa svemu sto sam radio do sada :) Jako pase u DDD, repozitorije, bounded context i sve one ljepe stvari o kojima Eric Evans prica u svojim knjigama.

 

Trenutno su mi SL aplikacije prepune slanja poruka (npr u VMu: Messenger.Publish(new SaveEmployee(data)), sto je dosta rasteretilo ViewModel klase. Pri startu aplikacije, automatski se potrebne BL klase pretplate na poruke (Messenger.Register<SaveEmployee>(this,employeeSaveMethod)), ili prođem sa refleksijom kroz cijeli assebmly, tražim određeni interface i registriram u centralni container handlera poruka. 

 

a jesam ga nadrobio ovdje svacega ;)

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
Poruka je uređivana zadnji put čet 21.4.2011 22:44 (hudo).
Moj PC  
0 0 hvala 1
13 godina
neaktivan
offline
Re: MVVM obrazac

Automatsko spajanje View-a i ViewModela. Npr ako instanciram EmployeeViewModel, zelim da mi se automatski pokaze EmployeeView.xaml

- To mi ne treba, nije mi jasno zašto bi na taj način striktno povezao VM i V?. Ima slučajeva gdje isti VM koristim za različite V.

 

IoC/DI u konstruktoru VMa, preko MEFa, Unitya ili neceg treceg

- Šta tu MVVM framework može pomoći? Ako imaš skonfiguriran DI container?

 

Behaviori za bindanje evenata kontrola za metode VM-a

- Opet, nije mi jasno koja je tu uloga MVVM frameworka, to su behaviori koje ili imaš ili nemaš

 

Automatsko bindanje nekih kontrola, npr: txtIme na public string Ime { get; set; }

- Niti u ludilu. Stvarno, kolko pomoći bi od toga imao?

 

Messeging bus (event bus), ala mediator pattern ...

- Nisam detaljno čitao ali Prism ima EventAggregator, mislim da je to to...

http://msdn.microsoft.com/en-us/library/ff921122%28v=pandp.20%29.aspx

 

DTO sa automapper
- Najčešće radim neku vrstu konverzije i specifičnog načina korištenja podataka kad instanciram BO, odnosno dohvaćam podatke, tako da auto dto mapper opet po meni ne dolazi u obzir

 

Prije sam se dosta pridrzavao pravila kreiranje repozitorija, service layera za BLL...

- Ne znam točno na što misliš, ja imam samo podatkovni sloj na serverskoj strani i jedan broj custom funkcija koje dohvaćaju podatke po složenom ključu, znači ako imaš neki ORM, sav rad s podacima preko ID-a nije potrebno implementirati u repozitoriju, već u nekim repozitorij baznim klasama

 

Sada se vise okrecem nekom pub/sub modelu rada cijele app: citanje podataka mora biti jednostavno, iz vec nekog denormaliziranog modela ili pomocu NH projekcija, ali bitno da se vrlo lako moze doci do podataka iz baze, bez komplikacija i 5 layera.

- To bi volio detaljnije pojašnjenje

 

- Šta se tiče komandi, mislim da ih koriste svi oni koji koriste i MVVM pattern, recimo Prism ima CompositeCommand, DelegateCommand i sl.

 

Šta je po meni zgodno, Prism ima još riješene module i navigaciju, sve fino integriram i sa browser historijem.

 

Mene posebno sad zanimaju unit testovi i logiranje u Silverlightu.

 

Također, živo me zanima kako pametno dohvaćati podatke iz Silverlighta kad se koriste neki složeni kriteriji. Znači, podaci nisu direktno dostupni u Silverlightu, nije moguće raditi LINQ upite i sl. Zanima me koji je pametan način postavljanja/kreiranja kriterija na SL strani a da se to lako može prevesti u neki kriterij na podatkovnoj strani...

Sad jednostavno kreiram posebne dto objekte koje instanciram u SL, to šaljem poslovnom sloju, poslovni sloj ih koristi da bi pozvao metodu s parametrima u podatkovom sloju... e tu vidim dobar prostor za napredak.

 

Evo to je to za sad :)

13 godina
neaktivan
offline
MVVM obrazac

 

Pozdrav,

 

Pozivajući se na raspravu s twittera evo i mojih 5 centa na temu. :)

 

Od MVVM frameworka prije sam koristio prism dok danas koristim MVVMLight koji više manje zadovoljava sve moje potrebe. Caliburn.Micro sam isprobao no nisam ga koristio nigdje u produkciji.

 

Sama arhitektura prezentacijskog sloja sastoji se od sljedećih patterna:

 

  • MVVM - očito :)
  • ServiceLocator - prevenstveno mi služi za dohvat viewmodel objekata iz DI container-a.
  • EventAggregator/MessageBus - komunikacijska kralježnica prezentacijskog sloja.
  • Command  - Ako se radi o krajnje jednostavnim komandama koje se koriste samo na jednom mjestu, implementiram ih inline unutar viewmodel-a. S druge strane, ako se radi o složenijim komandama ili ako se komanda koristi na različitim mjestima implementaciju realiziram u zasebnoj klasi.
  • Service Broker/Dispatcher - služi mi za koordinaciju komunikacije između servisa koji se nalaze na serveru i svih viewmodel objekata u aplikaciji. Upotrebom dispatcher objekta, osigurava se modularnost i labava povezanost na način da viewmodel klase ne moraju poznavati informacije o servisima koji služe za dohvat/spremanje podataka na serveru. Komunikacija se ostvaruje putem event aggregatora/messagebus-a.  Također, service dispatcher/broker je obično mjesto gdje stavljam keš prezentacijskog sloja.

 

U 95% slučajeva view bind-am na viewmodel unutar xamla. Iznimke su slučajevi kada želim određenoj funkcionalnosti view-a pristupiti u viewmodel-u. U tom slučaju, view implementira odgovarajući interfejs koji se inject-a u viewmodel čime zadržavam labavu povezanost između view i viewmodel klasa.

 

Kompleksna sučelja izbjegavam na način da ih odvojim u zasebne view/viewmodel klase(npr. AddressSearchBarView-AddressSearchBarViewModel

CoordinatesSearchBarView-CoordinatesSearchBarViewModel

SomeResultView-SomeResultViewModel

 

Na taj način eliminiram kompleksnost upravljanja korisničkim sučeljem.

 

U slučaju kada trebam omogućiti dodatnu logiku na kontrolama, koristim behaviour-e, kojima osiguravam dodatnu funkcionalnost.

 

Ako imam kompleksno sučelje ili nekakav kompleksni workflow, najčešće takvu logiku implementiram kao zasebnu kontrolu, gdje unutar kontrole upravljam izvođenjem, a expose-am samo one dependency property-e koji su mi potrebni za viewmodel.

 

Kao DI kontejnere sam koristio Unity i ninject.

 

Na serverskoj strani imam klasičnu arhitekturu podijeljenu u logičke/fizičke slojeve. S obzirom, da sam veliki štovatelj dijela i lika Eric Evans-a :), okosnicu serverske strane čini model. Unutar modela implementiram entitete, value objekte i specifikacije(linq je dosta eliminirao potrebu za istim). Svu funkcionalnost koja pripada modelu, implementiram unutar entiteta i value objekata kako ne bih imao anemičan model. Također, u modelu se nalaze interfejsi od repozitorija. Sama implementacija repozitorija nalazi se u DAL sloju u kojem najčešće koristim fluent nhibernate.  Iznad DAL sloja nalazi se fino granuliran BLL koji to sve drži na skupu. Klijent aplikacija se spaja na grubo granuliran servis koji je u principu remote facade za BLL.

 

S obzirom da je Silverlight rich client, često mi odgovara da punu funkcionalnost modela imam i na strani servera i klijenta. U tom slučaju, u zasebnom assembly-u se soft linkam na postojeći model na serveru čime izbjegavam repeticiju koda za istu logiku.

 

Malo van topica:

 

O CQRS-u sam puno čitao, gledao screencast-ve, i čini mi se kao odličan arhitekturalni pristup no nisam ga imao priliku probati u praksi. :(. Za dvojac koji posebno promoviraju CQRS(Udi Dahan i Greg Young, svaki sa svojeg stajališta), smatram da trenutno spadaju u vodeće mislioce s aspekta arhitekture složenih poslovnih sustava. 

 

Što se tiče pub/sub rješenja i messaging-a uopće ako slučajno niste pročitali, svakako preporučam Enterprise Integration Patterns by Hohpe, Woolf

 

Lp,

Hrvoje

 

 

Poruka je uređivana zadnji put pet 22.4.2011 11:11 (hstanisic).
 
0 0 hvala 1
16 godina
offline
MVVM obrazac

Glede svih ovih komentara koje si naveo, apsolutno se slazem da to nema neke veze sa MVVMom. Ja sam mislio s time reci da to uvelike smanjuje posao: npr sa MVVMLightom, ili rucno, uvjek iznanova pisem isti kod za spajanje VM i V, bindanje na propertye, bindanje eventa na metode, itd. Sve te stvari se mogu ustvari i automatsko napraviti prema uprogramiranim konvencijama, i onda na to dodati rucno jos neke stvar i - konvencije nikada ne brane rucno bindanje. 

 

Npr konvencije:

txtIme binda na prop string Ime { get; set; }, ako nema set; onda postavi One Way binding

btnSave.Click binda na void Save()

cbCategories.ItemsSource binda na ObserveableCollection Categories { get; set; }

contentControlMojPlaceHolder binda na property NekiViewModel MojPlaceHolder { get; set; } - i ovo je prezakon - cim ja napravim novi VM, ovaj sam nadje View i prikaze ga u tom placeholderu (content control kontrola na view-u)! 

 

Kod objektnog dizajna VM, M i BL klasa u SL aplikaciji, uvjek se pokusavam drzati SOLID principa, da objektni model bude pravilno izgrađen. Zbog toga mislim da je jako vazno imati u konstruktoru depencency objekte koje zahtjeva taj VM, i da IoC framework ih sam instancira, a ne ja!

 

Sto se tice layera, koliko si upoznat sa DDDom, odnosno aggregate rootovima, domain/value objektima, bounded contextom, repozirorijima, application, service layerom? Jako cesto se u literaturi mogu naci upute kako sloziti layere aplikacije prema DDD principu (cak i MSDN se fura sada na to), ali IMHO rijetko spomenu da je cijela poanta DDD-a modeliranje objekata prema poslovnom procesu domene. Negdje jednostavno ne treba biti toliko layera, ako nema direktne koristi i razloga za to!

 

Susreo sam se sa istim problemom sto ti spominjes, oko dohvata podataka i slozenih upita, filtera i slicnog.

Do sada sam to radio RPC-style, brdo expozanih metoda u WCFu. Pa sam probao sa Silverlight RIA Services, koji nudi pisanje LINQ upita u SLu, pa serijalizacija i prenosenje na server i tamo izvrsavanje (kvazi REST nacin), ali to funkcionira samo sa malim aplikacijama.

 

Osobno mislim da je pravo rjesenje za to punokrvni REST web servis, preko kojega se izloži model podataka, i klijent (SL) pravilnim slaganjem URLa i http metodama (post, get, put, delete) dohvaca podatke i sprema ih. 

Znam da se tu gube cijele SOAP ludarije, ali jos bi volio vidjet to sve to u praksi. Citam po twitteru i blogovima, ekipa uglavnom bjezi sa SOAPa na REST. Microsoft ce uskoro izdati pravi REST servis, koji je sada u nekoj Preview fazi, i razvoj vodi Glenn Block (bio PM na MEF frameworku). Tako da ce to biti napravljeno kako treba. 

OpenRasta, izvrsni opensource REST web framework je uvjek dobra opcija za REST layer za SL aplikacije! Ne samo to, i kao zamjena za ASP.NET MVC!

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
Moj PC  
0 0 hvala 1
13 godina
neaktivan
offline
Re: MVVM obrazac
ivankujundzic kaže...

 

 

Sada se vise okrecem nekom pub/sub modelu rada cijele app: citanje podataka mora biti jednostavno, iz vec nekog denormaliziranog modela ili pomocu NH projekcija, ali bitno da se vrlo lako moze doci do podataka iz baze, bez komplikacija i 5 layera.

- To bi volio detaljnije pojašnjenje

 

- Šta se tiče komandi, mislim da ih koriste svi oni koji koriste i MVVM pattern, recimo Prism ima CompositeCommand, DelegateCommand i sl.

 

 

 

Ovdje se u principu radi o komandama koje izlaze iz okvira SL-a, ali princip ostaje isti. U biti komande nisu ništa drugo nego obični DTO objekti čije ima sugerira namjeru. Npr. DeleteCustomerCommand gdje klasa sadrži samo one podatke koji su potrebni da se izvrši komanda.(recimo CustomerId). U principu, kod CQRS-a radi se o dizanju CQS principa na arhitekturalnu razinu. Po meni najveća snaga leži upravo u odvajanju i optimiziranju spremišta za pisanje i čitanje. Ako govorimo u konteksu relacijskih baza podataka, čitanje bi išlo iz denormaliziranih tabela, dok bi rezultati komanda spremali u normalizirani dio. 

13 godina
neaktivan
offline
Re: MVVM obrazac
hudo kaže...

Glede svih ovih komentara koje si naveo, apsolutno se slazem da to nema neke veze sa MVVMom. Ja sam mislio s time reci da to uvelike smanjuje posao: npr sa MVVMLightom, ili rucno, uvjek iznanova pisem isti kod za spajanje VM i V, bindanje na propertye, bindanje eventa na metode, itd. Sve te stvari se mogu ustvari i automatsko napraviti prema uprogramiranim konvencijama, i onda na to dodati rucno jos neke stvar i - konvencije nikada ne brane rucno bindanje. 

 

Npr konvencije:

txtIme binda na prop string Ime { get; set; }, ako nema set; onda postavi One Way binding

btnSave.Click binda na void Save()

cbCategories.ItemsSource binda na ObserveableCollection Categories { get; set; }

contentControlMojPlaceHolder binda na property NekiViewModel MojPlaceHolder { get; set; } - i ovo je prezakon - cim ja napravim novi VM, ovaj sam nadje View i prikaze ga u tom placeholderu (content control kontrola na view-u)! 

 

 

Meni taj dio konvencije iznad konfiguracije najviše fali u MVVMLight-u..

16 godina
offline
Re: MVVM obrazac
hstanisic kaže...

 

 

O CQRS-u sam puno čitao, gledao screencast-ve, i čini mi se kao odličan arhitekturalni pristup no nisam ga imao priliku probati u praksi. :(. Za dvojac koji posebno promoviraju CQRS(Udi Dahan i Greg Young, svaki sa svojeg stajališta), smatram da trenutno spadaju u vodeće mislioce s aspekta arhitekture složenih poslovnih sustava. 

 

Što se tiče pub/sub rješenja i messaging-a uopće ako slučajno niste pročitali, svakako preporučam Enterprise Integration Patterns by Hohpe, Woolf

 

Lp,

Hrvoje

 

 

 

Cijeli CQRS je koristan uglavnom kod izrade slozenijih SOA arhitektura, ali neki koncepti se mogu ukrasti u za malene aplikacije: odvojen read (query) model od command-a. Bez queue-a, async pozivanja i sync-a domain modela i read modela. To je vec dovoljno za pravilnu enkapsulaciju logike u aplikaciji i vecu kvalitetu koda. 

 

Hvala na prijedlogu za citanje ...

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
16 godina
offline
Re: MVVM obrazac
hstanisic kaže...


 

Meni taj dio konvencije iznad konfiguracije najviše fali u MVVMLight-u..

 

tocno tako, to je i glavni razlog mog prelaska na Caliburn.Micro. To, Model First pristup, i vec ugrađen MEF za IoC/DI. Davno sam bio gledao puni Caliburn, ali je bio prekompleksan, ovaj Micro se skuzi u jedan dan max. 

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
13 godina
neaktivan
offline
Re: MVVM obrazac
hudo kaže...

 

Cijeli CQRS je koristan uglavnom kod izrade slozenijih SOA arhitektura, ali neki koncepti se mogu ukrasti u za malene aplikacije: odvojen read (query) model od command-a. Bez queue-a, async pozivanja i sync-a domain modela i read modela. To je vec dovoljno za pravilnu enkapsulaciju logike u aplikaciji i vecu kvalitetu koda. 

 

Hvala na prijedlogu za citanje ...

 

Nema problema :). 

 

Ne bi bilo loše otvoriti jedan topic i za razmjenu mišljenja/preporuke o knjigama :)

13 godina
neaktivan
offline
MVVM obrazac

Hmm vidim da bi ovo moglo postati zanimljivo. Svi se vrtimo oko istih/sličnih stvari.

 

Za početak, @hstanisic, zašto si odustao od Prism-a?

Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: MVVM obrazac
ivankujundzic kaže...

Hmm vidim da bi ovo moglo postati zanimljivo. Svi se vrtimo oko istih/sličnih stvari.

 

Za početak, @hstanisic, zašto si odustao od Prism-a?

 

Pronašao sam MVVMLight :)

13 godina
neaktivan
offline
Re: MVVM obrazac
hstanisic kaže...

 

Pronašao sam MVVMLight :)

 

Super :) , onda me zanima kako riješiti modularnost, kompoziciju, navigaciju i slicne stvari što nudi Prism? Mislim, jel ja griješim što ne koristim MVVLight ili Caliburn koje kolko vidim svi koriste a Prism skoro nitko ...

13 godina
neaktivan
offline
MVVM obrazac

Kužim ja da je Prism debeli, teški, kompleksan i to, ali ako izostavimo veličinu, postoje li tu neki problemi za koje ja nisam svjestan ili je MVVMLight toliko bolji od Prism-a?

Moj PC  
0 0 hvala 0
16 godina
offline
MVVM obrazac

MVVMLight je valjda korak znad view.DataContext = new ViewModel();

Prism je nešto puno više. Caliburn.Micro je negdje na pola puta, više prema Prismu, i ima jedva 2000 linija koda, s time da on daje "opinioned" pristup sa konvencijama, kome se to ne svidja onda nema koristi od njega, IMHO. 

Takodjer, Calib.Micro ima neke klase za Navigaciju, ali opet dosta "opinioned".  

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
MVVM obrazac

Može jedno konkretno pitanje šta se tiče SL-a, datagrid-a i MVVM?

 

Naime u datagrid row-u nije moguće doći do DataContext-a, pa me zanima jel ovo dobro rješenje za bindanje gumba u datagridu na command u VM-u?

 

1. Kreirao sam jednu turbo jednostavnu servis klasu:

 

 public class CurrentContextService : DependencyObject
    {
        public Object Context
        {
            get { return (Object)GetValue(ContextProperty); }
            set { SetValue(ContextProperty, value); }
        }
        public static readonly DependencyProperty ContextProperty =
            DependencyProperty.Register("Context", typeof(Object), typeof(CurrentContextService), new PropertyMetadata(null, new PropertyChangedCallback(ContextPromijenjen)));

        private static void ContextPromijenjen(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {

        }
    }

 

2. u UserControl koja ima grid sam dodao resource i na Context DP servis klase bindao DataContext :


    <UserControl.Resources>
        <SharedServices:CurrentContextService x:Key="CurrentContextService"
                                              Context="{Binding ElementName=UserControlName, Path=DataContext}"></SharedServices:CurrentContextService>
    </UserControl.Resources>

 

kako ima def. konstruktor, xaml ga instancira bez problema...

 

3. U datagridu na gumb bindam komandu iz VM-a i proslijeđujem trenutnu vrijednost iz Item-a

 

                                   <Button Height="25"
                                            cal:Click.Command="{Binding Source={StaticResource CurrentContextService}, Path=Context.DodajCommand}"
                                            cal:Click.CommandParameter="{Binding}"">

 

4. Stvar štima

 

No, nekako mi se čini puno databindanja, bojim se kasnije eventualnog curenja memorije... Ima tko kakvu ideju jel ovo ok pristup?

 

Moj PC  
0 0 hvala 1
16 godina
offline
MVVM obrazac

 

Ako sam shvatio, ti se nalazis unutar grida, i zelis pozvati neku metodu na button click i prosljediti joj referencu od trenutnog itema, objekta bindanog za red?

 

To ja ovako rjesavam, pisano sa MVVMLighom, bez onih static resource contexta i dependency objekata, samo obicni VM bindan na V:

 

<UserControl x:Name="MainBL">

<ItemsControl  ItemsSource="{Binding Model.Biljeske}" >

<ItemsControl.ItemTemplate>

<DataTemplate>

  <HyperlinkButton>

   <i:Interaction.Triggers>

   <i:EventTrigger EventName="Click">

   <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding DataContext.NekaVMMetoda, ElementName=MainBL, Mode=OneWay}" 

  CommandParameter="{Binding}"/>

   </i:EventTrigger>

   </i:Interaction.Triggers>

  </HyperlinkButton>

 

</ItemsControl.ItemTemplate>

</DataTemplate>

 

 

znacim, kod bindanja na metodu, referenciram se preko "MainBL" imena UCa i njegovog DataContexta, tako mogu dobiti sve metoda koje su u glavnom VM, a ne da vidim samo scope od List<T> na sto je bindan ItemsControl.  Slicno kao sto je Ivan napisao, samo bez onog Dependency Objecta u Resourcima. 

Također, ovako nema gdje biti memory leak...

 

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
Poruka je uređivana zadnji put pon 2.5.2011 15:19 (hudo).
Moj PC  
0 0 hvala 1
13 godina
neaktivan
offline
MVVM obrazac

Probaj to u DataGridu i poprilično sam siguran da ne radi :)

Znači datagrid, odnosno datagridcolumn ne vidi DataContext, te se i ne možeš na  njega bindati. Vidi jedino itemsource item i definirane resurse...

 

Pozdrav!

Moj PC  
0 0 hvala 0
16 godina
offline
MVVM obrazac

Ali cini mi se da vidi DataContext jer mu ga referenciras preko elementa MainBL! To je u biti obicni Dependency property, koji nije vezan na kontrolu, nego nacin na koji radi bindanje u SLu... probaj, mislim da bi trebalo raditi

Smith and Wesson - the original point and click interface | http://twitter.com/hhrvoje, http://www.hudosvibe.net
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Re: MVVM obrazac

AFAIR, ovo sto je predlozio Hudo bi trebalo raditi. Takodjer, tvoje rjesenje je isto korektno IMO :)

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice