[ mmix @ 04.10.2011. 18:49 ] @
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.
[ logic_rabbit @ 05.10.2011. 06:40 ] @
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...
[ mmix @ 05.10.2011. 08:36 ] @
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?
[ logic_rabbit @ 05.10.2011. 18:47 ] @
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...