Question

Je commence avec MVVM, et je commence à comprendre les choses. Je suis actuellement à expérimenter avec le cadre Cinch, bien que je ne suis pas engagé à ce pour l'instant.
Je me injectais les ViewModels dans les vues à l'aide en ayant une référence à la ViewModel dans le codebehind de la vue, avec la propriété ayant une [dépendance] sur elle, et dans le setter, il définit le DataContext à la vue de droite, en utilisant l'unité. astuce, je pensais.

Je suis en train de faire mon application pour travailler comme une seule fenêtre, avec vue sur l'injection (par opposition aux fenêtres multiples et de traiter avec l'ouverture \ les fermer) J'ai changé mon point de vue de Windows à UserControls, et a ajouté un à la fenêtre principale. Cela a fonctionné, mais le ViewModel n'a jamais été injecté, probablement parce que le XAML n'utilise pas Container.Resolve pour créer la vue, comme quand j'ai créé la vue et ajouté manuellement dans le code-behind en utilisant Resolve, a été créé le [dépendance] .

Comment puis-je configurer ma fenêtre, de sorte que si j'ajoute une vue à travers XAML, ou la vue se change en raison d'une action de l'interface utilisateur, etc., ce qu'elle passe à travers l'unité, afin qu'il puisse travailler sa magie?

Était-ce utile?

La solution

La façon de résoudre votre problème est de rendre votre fenêtre pour avoir un ViewModel aussi bien, avec ViewModels de UserControls expose que les propriétés sur elle. Ensuite, dans votre XAML pour une fenêtre que vous souhaitez simplement utiliser le mécanisme de reliure pour lier les DataContexts de UserControl à des propriétés appropriées de votre votre ViewModel principale. Et depuis que le principal ViewModel est résolu à partir du récipient unité, il aurait tous les autres ViewModel-s injecté au besoin.

Autres conseils

Ce problème est normalement résolu à l'aide des Régions et le RegionManager. Dans la fenêtre principale ViewModel, un ensemble de régions est créée et ajoutée à la RegionManager. Ensuite ViewModels peuvent être résolus et ajoutés à la collection Region.Views.

XAML, la région est normalement injecté en ayant la propriété ItemsSource d'un ItemsControl lié à la propriété de la région ViewModel principale.

Ainsi, dans l'écran principal ViewModel vous auriez quelque chose comme ceci:

    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; }
}

Ce serait résolu normalement dans votre 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

Et la représentation XAML de votre modèle ressemblant à quelque chose comme

    <DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}">
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" />
        </StackPanel>
    </ScrollViewer>
</DataTemplate>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top