Domanda

Sto partendo con MVVM, e sto iniziando a capire le cose. Attualmente sto sperimentando con il quadro Cinch, anche se non sono impegnato ad esso come ancora.
Ero iniettare la ViewModels nelle viste usando avendo un riferimento al ViewModel nel codebehind della vista, con la struttura avente una [Dipendenza] su di essa, e nel Setter imposta il DataContext alla vista destra, mediante Unity. trucco pulito, ho pensato.

Sto cercando di ottenere la mia app per funzionare come una singola finestra, con vista iniettati (al contrario di finestre multiple e si occupano di apertura \ chiusura loro) Ho cambiato le mie opinioni da Windows a controlli utente, e aggiunto un alla finestra principale. Che ha funzionato, ma il ViewModel non è mai stato iniettato, presumibilmente perché il XAML non utilizza Container.Resolve per creare la vista, come quando ho creato la vista e aggiunto manualmente nella Resolve codice sottostante utilizzando la [Dipendenza] è stato creato .

Come posso impostare la mia finestra, in modo che se aggiungo una vista attraverso XAML, o la vista viene cambiato a seguito di un'azione di interfaccia utente, ecc, si ottiene attraverso l'unità, in modo che possa lavorare la sua magia?

È stato utile?

Soluzione

Il modo per risolvere il tuo problema è quello di rendere la vostra finestra per avere un ViewModel pure, con ViewModels di controlli utente espone come proprietà su di esso. Poi, nel tuo XAML per una finestra che ci si sufficiente utilizzare meccanismo vincolante per legare DataContexts di UserControl di adeguate proprietà del tuo ViewModel principale. E dal momento che il ViewModel principale viene risolto dal contenitore Unità avrebbe tutte le altre ViewModel-s iniettata in base alle esigenze.

Altri suggerimenti

Questo problema viene normalmente risolto utilizzando le Regioni e il RegionManager. Nella finestra principale ViewModel, un insieme di regioni viene creato e aggiunto al RegionManager. Poi ViewModels possono essere risolti e aggiunti alla collezione Region.Views.

In XAML, la regione è normalmente iniettato avente la proprietà di ItemsSource ItemsControl legata alla proprietà regione del ViewModel principale.

Quindi, nella schermata principale ViewModel si sarebbe qualcosa di simile:

    public class TestScreenViewModel
{
    public const string MainRegionKey = "TestScreenViewModel.MainRegion";

    public TestScreenViewModel(IUnityContainer container, IRegionManager regionManager)
    {
        this.MainRegion = new Region();
        regionManager.Regions.Add(MainRegionKey, this.MainRegion);
    }

    public Region MainRegion { get; set; }
}

Questa sarebbe risolto normalmente nel vostro IModule

        #region IModule Members

    public void Initialize()
    {
        RegisterViewsAndServices();

        var vm = Container.Resolve<SelectorViewModel>();
        var mainScreen = Container.Resolve<TestScreenViewModel>();
        mainScreen.MainRegion.Add(vm);

        var mainView = ContentManager.AddContentView("Test harness", mainScreen);
    }

    #endregion

E la rappresentazione XAML del template cercando qualcosa di simile

    <DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}">
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" />
        </StackPanel>
    </ScrollViewer>
</DataTemplate>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top