Frage

Ich fange mit MVVM, und ich fange an Dinge zu verstehen. Ich bin derzeit mit dem Cinch-Rahmen zu experimentieren, obwohl ich es jetzt noch nicht verpflichtet bin.
Ich war die Injektion der Viewmodel in die Ansichten unter Verwendung von einem Verweise auf das Ansichtsmodell in dem Code-Behind der Ansicht ist, mit der Eigenschaft, eine [Abhängigkeit] auf sie hat, und in dem Setter setzt er den Datacontext auf die rechte Ansicht, mit Unity. Ordentlich Trick, dachte ich.

Ich versuche, meine App zu arbeiten als ein einzelnes Fenster zu bekommen, mit injizierten Ansichten (im Gegensatz zu mehreren Fenstern gegenüber und den Umgang mit dem Öffnen \ Schließen ihnen) Ich änderte meine Ansichten von Windows auf Benutzersteuerelemente, und fügte hinzu, ein in das Hauptfenster. Das funktionierte, aber das Ansichtsmodell wurde nie injiziert, vermutlich weil die XAML nicht Container.Resolve verwenden, um die Ansicht zu erstellen, als wenn ich die Ansicht erstellt und hinzugefügt, um es manuell in der Code-behind mit Resolve, die [Abhängigkeit] wurde erstellt .

Wie kann ich mein Fenster einrichten, so dass, wenn ich einen Blick durch XAML hinzufügen oder die Ansicht wird als Ergebnis einer UI-Aktion usw. geändert, es es durch Unity wird, so dass es seine Magie arbeiten?

War es hilfreich?

Lösung

Die Art und Weise, Ihr Problem zu lösen, ist das Fenster, um ein Ansichtsmodell sowie zu haben, mit den Viewmodeln Usercontrols entlarvt als Eigenschaften auf sie. Dann in Ihrem XAML für ein Fenster würden Sie einfach verwenden Mechanismus Bindung an binden Usercontrol Datacontexts zu richtigen Eigenschaften Ihrer Hauptansichtsmodell. Und da das Hauptansichtsmodell von Unity Container aufgelöst hätte es alle anderen Ansichtsmodell-s je nach Bedarf injiziert.

Andere Tipps

Dieses Problem wird normalerweise mit Regionen gelöst und die RegionManager. Im Hauptfenster Ansichtsmodell ein Satz von Regionen erzeugt und auf die RegionManager hinzugefügt. Dann können Viewmodel in der Region.Views Sammlung gelöst und hinzugefügt werden.

In XAML wird die Region injiziert normalerweise durch die Itemssource Eigenschaft eines Items aufweist, gebunden an die Region Eigenschaft des Hauptansichtsmodell.

Also, auf dem Hauptbildschirm Ansichtsmodell Sie etwas davon haben würde:

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

Dies Gelöst normalerweise in Ihrem IModule würde

        #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

Und die XAML-Darstellung Ihrer Vorlage suchen so etwas wie

    <DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}">
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" />
        </StackPanel>
    </ScrollViewer>
</DataTemplate>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top