2010-12-10 7 views
3

Ich habe eine Windows WPF App, in der ich Caliburn.Micro verwende. Das Hauptfenster View/Viewmodel wird von Caliburn.Micro verarbeitet. Eine der Schaltflächen öffnet ein neues Dialogfenster, das ein anderes View-View-Modell verwendet.Dialogansicht mit zwei Caliburn.Micro-Ansichten?

In diesem Dialog habe ich einen Container (Listenfeld und einige Filtersteuerungen), die ich in ein wiederverwendbares Steuerelement machen möchte, so dass ich es in andere Dialoge einbinden kann. Dazu habe ich aus dem Sicht- und Ansichtsmodell des Dialogs den entsprechenden Code extrahiert und ein neues View- und Viewmodel erstellt. Das sieht alles gut aus.

Das Problem ist, dass jetzt wieder im Dialogfeld Ich habe ein Dockpanel mit einem großen leeren Raum, wo ich das wiederverwendbare Steuerelement zu gehen brauche.

Aus dem Dialog ViewModel OnInitalize() konnte ich das wiederverwendbare Control ViewModel erstellen, aber ich weiß nicht, wie ich es in das Dockpanel der Dialogansicht bringen kann.

Um den Dialog aus dem Hauptfenster viewmodel zu erstellen, benutze ich WindowManager(). ShowDialog(), um das Viewmodel für den Dialog anzuzeigen und Caliburn.Micro kümmert sich um die Einrichtung der Ansicht. Kann ich im XAML des Dialogfelds angeben, dass ich die Ansicht für das wiederverwendbare Steuerelement einbetten und Caliburn das entsprechende Ansichtsmodell erstellen möchte?

Oder mache ich es falsch?

Antwort

8

Wenn Sie eine Eigenschaft in Ihrem Dialog-View-Modell haben, das ein anderer View-Modelltyp ist, und fügen Sie Ihrer Dialogansicht ein ContentControl hinzu, das denselben Namen wie diese Eigenschaft hat, dann injiziert Caliburn.Micro automatisch die entsprechende Ansicht Zu Ihrer Eigenschaft zeigen Sie den Modelltyp in den ContentControl-Platzhalter an und binden diesen Ansichtsmodelltyp ebenfalls automatisch an die Ansicht. Ist es das was du meinst? Etwas wie:

// Dialog View Model 
private MyReusableControlViewModel myReuseableControl; 
public MyReusableControlViewModel MyReuseableControl 
{ 
    get { return this.myReuseableControl; } 
    set { this.myReuseableControl = value; NotifyOfPropertyChanged(...); } 
} 

// Dialog View Model Constructor 
public DialogViewModel() 
{ 
    this.MyReuseableControl = new MyReusableControlViewModel(); 
} 

// Dialog View 
<DockPanel> 
    ... 
    <ContentControl x:Name="MyReusableControl" /> 
</DockPanel> 

Natürlich, im Idealfall würden Sie alle Abhängigkeiten des Dialogansicht Modells zu injizieren (in diesem Fall MyReusableControlViewModel) und Arbeit gegen Abstraktionen in der Dialogansicht Modell, anstatt konkrete Typen.

+0

Das klingt genau nach was ich suche, ich werde es versuchen. – DaveK

+0

Funktioniert perfekt, danke! – DaveK

+0

Habe ein paar Stunden damit verbracht, das herauszufinden, dann habe ich diese Antwort gefunden. Vielen Dank, die Lösung war viel einfacher als ich dachte. –