Pereiti prie turinio

MVVM ViewModel kreipimasis i kita ViewModel


Rekomenduojami pranešimai

Sveiki, turiu ce toki klausima. Tarkim turiu 2 ViewModel'ius. Pirmame yra: Button, TextBlock. Antrame tiktai TextBlock. Pirmo TextBlock background subindinu su pirmo ViewModelio property. Antro TextBlock background subindinu su antro ViewModelio property. Ir dabar paspaudes migtuka (jis pirmame ViewModelije) as noriu pakeisti ir pirmo ir antro TextBloku backgroundu's. Aisku terp property implementuoju INotifyPropertyChanged, kad UI atsinaujintu vos tik ta property gavo kita reiksme. Problema ta, kad paspaudus migtuka pasikeicia tik pirmame ViewModelije esancio TextBlock'o background'as. Ir jau visa diena bandau issaiskint delko taip vyksta. Kas idomiausia tai, kad as i antro ViewModelio ta property kuria bindinu su TextBloko backgroundu taipat implementaves INotifyPropertyChanged ir uzdejus breakpointa ji hitinu kai leidziu per debugeri bet UI neatsinaujina, nors tos property value jau turi spalva. Ce idejau maza programele kuri imituoja mano problema. Jei kas pagelbesit busiu labai dekingas, ce kazkur kazko nedarasau ir atsakymo niekur net StackOverflow neradau.. nors problema tikrai is paziuros vienas juokas tiem kas zino issprest :) Problema imituojantis mazas app: http://www.filedropp...m/mvvmklausimas

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tu tiesiog nepribindini TestViewModel1 esantį modelį TestViewModel2 prie TestView2 viewo, o tame viewe(TestView2) sukuri naują modelį, todėl ta spalva, kurią pakeiti ir neatsivaizduoja. Šiaip neaišku kokia situacija, bet aiškiau sakyčiau būtų turėti tarpinį modelį, kuris savyje turi šiuos du modelius ir komandą keičiančią spalvą, būtų tiek valdymas paprastesnis, tiek aiškumas didesnis. Tas pats ir su viewais, tuos du viewus susidėtum į vieną bendrą view'ą, kurio DataContext modelis būtų pagrindinis modelis su komanda, o testView1 ir testView2 jau pribindintum tuos mažesnius modelius pagrindinio modelio.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

O kodėl negali turėti vieno ViewModel su vienu View? Suptantu, kad tai tik pavyzdys, bet nelabai sugalvoju realią situaciją, kada taip reikėtų

Tokioje sitacijoje kokia yra sita programa tai taip ir daryciau kaip tu siulai, bet as noriu zinoti kaip mano ViewModeliai gali sneketis tarpusavije pagal tokia ir tokia logika.

 

Tu tiesiog nepribindini TestViewModel1 esantį modelį TestViewModel2 prie TestView2 viewo, o tame viewe(TestView2) sukuri naują modelį, todėl ta spalva, kurią pakeiti ir neatsivaizduoja. Šiaip neaišku kokia situacija, bet aiškiau sakyčiau būtų turėti tarpinį modelį, kuris savyje turi šiuos du modelius ir komandą keičiančią spalvą, būtų tiek valdymas paprastesnis, tiek aiškumas didesnis. Tas pats ir su viewais, tuos du viewus susidėtum į vieną bendrą view'ą, kurio DataContext modelis būtų pagrindinis modelis su komanda, o testView1 ir testView2 jau pribindintum tuos mažesnius modelius pagrindinio modelio.

 

 

Na taip as padarau TestView2 DataContext = TestViewModel2. Ir subindinu TestViewModel2 Brush property prie TestView2 backgroundo, Viskas kaip ir turetu buti gerai. Paskui kai spaudziu migtuka Su pirmu ViewModeliu viskas aisku, veikia taip kaip ir turi, bet su antru mano akim darosi magiski dalykai :) As kvieciu metoda kuris keicia spalva, kuris yra ViewModel2 kad pakeistu ViewModel2 esancios Brush property spalva. Property pasikeica o Ui neatsinaujina.. Nors pribindinta tai mano atzvilgiu teisingai. Ta prasme kad nesigilint i problema klausimas butu kaip tarkim ViewModel1 gali kviesti ViewModel2 ir galimai pakeisti ViewModel2 kazkokios tai property value kuri butu realiu laiku atvaizduojama UI. Kaiptik sita as ce ir bandau issiaiskint :) Ar geriau kurti viena dideli ViewModeli viskam? Bet ce jau sitas kaip ir priestarautu MVVM principui kuris yra: Vienam View turi buti Vienas ViewModel'is.

Redagavo highontrance
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kai reikės ir padarysi. Dabar specialiai nesimokyk. Kodėl? Nes WPF apskritai yra magic. Išmoksti kai darai :) ir beto toks susiejimas modelių, man bent jau nelabai gražus atrodo. Darbe kiek teko dirbti su MVVM, tai niekada nereikėjo iš "tėvo" kažką pakeisti taip kitame modelyje.

 

Bet išrišau kaip galima padaryti :D

 

TestView2 DataContext nenustatyk tame pačiame view'e. Juk TestViewModel2 turi TestViewModel1 modelyje. Vadinasi jeigu priskiriant TestView1 DataContext nustatytum ir TestView2, viskas suveiktų ;) Dalis kodo apačioje. Idėjus šitą, turėtų suveikti, tik TestViewModel1 pasidaryk TestViewModel2 property :)

 

 public TestView1()
       {
           InitializeComponent();
           DataContext = new TestViewModel1();

           TestView2 antrosSpalvosUserControl = new TestView2();
           antrosSpalvosUserControl.DataContext = (DataContext as TestViewModel1).TestViewModel2;
           Kvadratas2Content.Content = antrosSpalvosUserControl;

       }

 

Ir po šito "fix'o" nebus dviejų TestViewModel2. Bus tik vienas, ir teisingas. Nors nežinau ar tvarkingai čia viskas gausis, bet veikia ;)

Redagavo Plutonium
Nuoroda į pranešimą
Dalintis kituose puslapiuose

https://www.dropbox.com/s/rfrl3i6b4y43k6z/MVVMKlausimas.7z patvarkytas kad veiktų. Kodėl nesikeičia spalva? Nes TestView1 nėra grido columns'u. Jei pamėgintum šiaip uždėti StackPanel background tia jis nepasikeistų. Todėl aš sustumdžiau dar ir į gridą. Tik netvarkingai išmėčiau testavimo suemtimais.

Dabar spėju vienas virš kito kažkai susistumdė ir nesipiešia :)

 

 

Ar geriau kurti viena dideli ViewModeli viskam? Bet ce jau sitas kaip ir priestarautu MVVM principui kuris yra: Vienam View turi buti Vienas ViewModel'is. [/size]

 

Priklausomai nuo situacijos. Aš pats linkęs būčiau paskirstyti truputi. Yra pirmas View, kuris realiai yra kaip ir Window pats. Tiesiog pradinis vaizdas. Jap reikės kažkokių properties, tai ir sudėsi tuos kelis į modelį. Paskui turim dar vieną View, kuris yra idėtas į pirmajį, ir pvz yra gridas, su daug stulpelių ir eilučių, dar kokia paieška šalia idėta. Na tiesiog struktūriškai sudėtingesnis už pirmajį. Tai jam darau irgi modelį. Taip bereikalingai antrojo view propeties neapkraus pirmojo modelio.

Darbe bent jau yra panaši situacija. Bet dar pvz pirmame lygyje yra eksportavimo mygtukas, kuris surenka viską iš antro lygio ir sueksportuoja. Vėlgi atskiras modelis gaunasi, nes tai tik eksportavimo dalis, ir kitiems per daugiausiai nereikia žinoti apie juos

 

Tikuosi supratai :D

Redagavo Plutonium
Nuoroda į pranešimą
Dalintis kituose puslapiuose

https://www.dropbox....VVMKlausimas.7z patvarkytas kad veiktų. Kodėl nesikeičia spalva? Nes TestView1 nėra grido columns'u. Jei pamėgintum šiaip uždėti StackPanel background tia jis nepasikeistų. Todėl aš sustumdžiau dar ir į gridą. Tik netvarkingai išmėčiau testavimo suemtimais.

Dabar spėju vienas virš kito kažkai susistumdė ir nesipiešia :)

 

 

 

 

Priklausomai nuo situacijos. Aš pats linkęs būčiau paskirstyti truputi. Yra pirmas View, kuris realiai yra kaip ir Window pats. Tiesiog pradinis vaizdas. Jap reikės kažkokių properties, tai ir sudėsi tuos kelis į modelį. Paskui turim dar vieną View, kuris yra idėtas į pirmajį, ir pvz yra gridas, su daug stulpelių ir eilučių, dar kokia paieška šalia idėta. Na tiesiog struktūriškai sudėtingesnis už pirmajį. Tai jam darau irgi modelį. Taip bereikalingai antrojo view propeties neapkraus pirmojo modelio.

Darbe bent jau yra panaši situacija. Bet dar pvz pirmame lygyje yra eksportavimo mygtukas, kuris surenka viską iš antro lygio ir sueksportuoja. Vėlgi atskiras modelis gaunasi, nes tai tik eksportavimo dalis, ir kitiems per daugiausiai nereikia žinoti apie juos

 

Tikuosi supratai :D

 

Na dabar kaip ir aisku. Dekui :) Niekad neprireike castint su "as" dar ir sita reikia pasiaiskint :) http://www.dotnetperls.com/as . Problema pas mane buvo tame jog as TestView2 priskiriau nauja TestViewModel2 instance. PS. Programoje kuria darau as turiu kelis UserControl's parases tarp atskiru XAML failu ir kiekvienam norejau daryti ViewModeli + norejau kad tie ViewModeliai sneketusi tarpusavi. Ta prasme jeigu ViewModel1 tokia ir tokia property pasikeite, tai pakeisk ViewModel2 tokia ir tokia property. Ir kai as buvau jiems priskires po atskira DataContext (View1.DataContext = ViewModel1, View2.DataContext = ViewModel2 ) gaudavau labai jau idomu outputa (Property pasikeisdavo, o UI neatsinaujindavo). Dabar darau taip: MainWindow.xaml.cs konstruktoriuje sukuriu MainWindowViewModel instance ir tiesiog padarau savo UserControl'am (jie atskiruose failuose) DataContext'a su sita instance. Jie nera labai skirtingi jog jiems reiketu atskiro ViewModel'io todel DataContext'a atstoja taspats ViewModel'is.

Redagavo highontrance
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...