Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

ViewModel injection u View bez code-behinda, view first

WPF
  • 3 odgovora
  • 3.482 pregleda

Najnovija ↓

ViewModel injection u View bez code-behinda, view first 04.10.2011. u 19:49 · pre 183 meseca #1
ok, znam da view model moze biti postavljen u konstruktoru:

Code (csharp):

    public partial class LossCurvesView : UserControl
    {
        public LossCurvesView(LossCurvesViewModel viewModel)
        {
            InitializeComponent();
            this.Loaded += (a, e) => { this.DataContext = viewModel; };
        }
    }
 



ali ne svidja mi se preterano ovaj pristup, em sto gubim design time binding nego jos i koristim code-behind nakon sve price o separacija murkupa od koda. Hteo bih da viewmodel injectujem nekako drugacije, kao npr kroz xaml :

Code (xml):
<UserControl ... xmlns:vmodel="clr-namespace:Risk.ViewModels.Curves"
   <UserControl.DataContext>
        <vmodel:LossCurvesViewModel />
    </UserControl.DataContext>
    ...


problem je sto ovo zahteva da viewmodel ima parameterless konstruktor sto je problem kada (a to je skoro uvek) view model ima dependencies. Tehnicki mogao bih dependencies da prebacim da budu attributed [Dependency] propertiji (iako iz nekog razloga komuna anatemise taj non-constructor pristup), medjutim problem je sto instancijaciju ViewModela vise ne radi Unity container vec radi xaml engine koji ne radi dependency injection.

Dakle, postoji li view-first metod za instancijaciju viewmodela bez uplitanja code-behinda? Blend i VS designer nekako mogu i da prevarim sa d:DesignSource/d:DataContext ali bih stavrno hteo da eliminisem code-behind bez da izgubim view-first.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: ViewModel injection u View bez code-behinda, view first 05.10.2011. u 07:40 · pre 183 meseca #2
Vecina MVVM framework-a to ima rijeseno koristeci neku varijantu ViewModel locatora ili nesto slicno.
Baci oko na ovaj clanak :
http://johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum

On u primjeru koristi MEF a ti zamjeni sa Unity-ijem i to bi trebalo biti to...
Potpis
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
Re: ViewModel injection u View bez code-behinda, view first 05.10.2011. u 09:36 · pre 183 meseca #3
Nisam video nista slicno u Prismu, mada nesto mi je sumnjivo i u ovom primeru jer sam razmisljao duz te linije, nesto na fazon

Code (xml):
DataContext="{Binding  Source={StaticResource ViewModelLocator}, Path=IdenitifkacijaVModela}"


Ali tu ima nekih problema. Prvo, sta je sa design time podrskom? Path mora da se binduje na object sto automatski ubija design-time tooling usled nedostatka metadata.
Drugo, za Unity psotoji problem sto Unity nema singleton container, kad resolvujes kroz container on moze sebe da mapira kroz resolved objekte u IUnityContainer/IServiceLocator ali isntancijacij iz XAMLa ne pocinje i specificnog kontejnera niti ViewModelLocator moze da zna koji kontejner da koristi. Jedini nacin je da staticki inicijalizujes ViewModelLocator kri kreiranju kontejnera?
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: ViewModel injection u View bez code-behinda, view first 05.10.2011. u 19:47 · pre 183 meseca #4
To je i jedan od razloga zasto vise ne koristim Unity. Prije sam ga wrappavao u singleton kontejner...
Sto se tice design time podrske, nemam pojma. Mozda da pogledas u npr. MVVM Light on to ima rijeseno na slican nacin, a sigurno ima design time podrsku...


Potpis
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme