Ich habe 3 Viewmodels:Warum bindet Caliburn Micro trotz der gleichen Namenskonventionen einige Ansichten ein, aber keine anderen?
- App.ViewModels.LoginViewModel
- App.ViewModels.NavigationViewModel
- App.ViewModels.AbcViewModel
und 3 Aufrufe:
- App.Views.LoginView
- App.Views.NavigationView
- App.Views.AbcView
In meinem AppBootstrapper wird Loginview wie so geladen:
protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
var windowManager = IoC.Get<IWindowManager>();
var loginModel = IoC.Get<ILogin>("Login");
windowManager.ShowWindow(loginModel, "LoginView");
}
Doch diese gibt, dass die Ansicht nicht für das Ansichtsmodell gefunden werden. Es sei denn, ich ändere den Namespace des LoginView in App.Views.Login.LoginView und belasse den VM-Namespace so wie er ist. Es funktioniert dann gut.
Nach einer erfolgreichen Anmeldung verwende ich den gleichen Prozess, um mein NavigationViewModel zu laden. (Nach dem Namespace in den App.Views.Navigation.NavigationViewModel geändert haben, so dass es tatsächlich funktioniert)
Derzeit dies lässt mich mit den folgenden Namensräume für die Ansichten:
- App.Views.Login. Loginview
- App.Views.Navigation.NavigationView
- App.Views.AbcView
NavigationViewModel ist ein Leiter, eine Liste von Viewmodels und eine TabControl auf die anzeigen, um sie anzuzeigen.
Leider muss ich dann manuell mein AbcViewModel an die View binden, sonst wird nichts angezeigt. Zum Beispiel:
AbcView abcv= new AbcView();
AbcViewModel abcvm= IoC.Get<AbcViewModel>("Abc");
ViewModelBinder.Bind(abcvm, abc, null);
Ich will alles den Caliburn Ansichtsmodell ersten Ansatz zu tun mit, so dass das Hinzufügen neue Viewmodel und Ansichten wir kümmern müssen manuell die Ansicht nicht zu binden. Ich habe mich an die Struktur gehalten und es funktioniert nicht. Wo gehe ich falsch?
Grundsätzlich gibt es eine Möglichkeit, die Calibrun erstellen und dann meine Ansicht binden kann, wenn ich mein ViewModel erstelle? Muss ich irgendwie den ViewLocator für jedes meiner Modelle aufrufen? Wenn ja, wie unterscheidet sich das von der manuellen Bindung, die ich gerade mache?
Weiß jemand von einem vollständigen Beispiel (Ganzes Projekt) eines Ansichtsmodells erstes caliburn Projekt, das ich schleichen kann?
Jede Hilfe geschätzt, danke im Voraus.
Matt
Sie müssen nichts tun, außer Bootstrapper zu konfigurieren. Caliburn.Micro verwendet die Konvention: 'Views/xyzView' maps zu' ViewModels/xyzViewModel'. Stellen Sie außerdem sicher, dass Sie Ihren Startpunkt von 'App.xaml' entfernen und' ResourceDictionary' hinzufügen. Ich habe eine [Vorlage] (https://github.com/fcin/Caliburn.Micro-DI-Example) erstellt, um mit caliburn.micro mit Dependency Injection zu beginnen – FCin
Prost für die schnelle Antwort. Hatte einen kurzen Blick auf Ihr Beispiel, wird später ein richtiges Aussehen haben, ich kann schon sehen, Ihr Bootstrapper ist viel einfacher als meins. Ich verwende auch einen CompositionContainer und habe dies mit einem CompositionBatch gekoppelt. 'Container = new CompositionContainer (neu AggregateCatalog (AssemblySource.Instance.Select (x => new Assembly (x)) OfType()).);' Ich verwende dann: 'Charge. AddExportValue > (() => container.GetExportValue ()); ' Um alle meine ViewModels (außer Navigation und Login) zum Container hinzuzufügen. –
Behalten Sie Ihre ViewModels und Views in derselben Lösung? Sie brauchen 'CompositionContainer' nicht. 'SimpleContainer' reicht aus, um Typen zu registrieren, die injiziert werden sollen, wenn sie sich im selben Projekt befinden. – FCin