Ich benutze MVVM Framework Caliburn Micro in meiner gesamten Anwendung mit ViewModel zuerst (oder so dachte ich). Wenn ich jedoch Probleme mit einem Dialog hatte, der TryClose(true)
fehlschlägt, sein Elternfenster zu schließen und stolperte über diese Frage, die mein Problem perfekt umriss, bekomme ich auch die "TryClose erfordert einen übergeordneten IConductor oder eine Ansicht mit einer Close-Methode oder IsOpen-Eigenschaft ".Caliburn Micro, Verwendung von ContentControl (oder Anzeige von 'Sub' ViewModel) mit ViewModel Zuerst
Caliburn.Micro - ShowDialog() how to close the dialog?
aber ich bin nicht sicher, wie genau die Lösung zu implementieren. Die Antwort lautet:
Entfernen Sie die cal: Bind.Model und cal: View.Model Bindungen ...
diese Bindungen ist eine Ansicht-First-Ansatz stellte sich heraus, das ich war nicht bewusst, dass ich es tat. Hier ist ein Beispiel meiner säumige Dialog:
<UserControl ... Height="206" Width="415">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="AUTO" />
</Grid.RowDefinitions>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button x:Name="Okay" Content="Okay" Width="100" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" />
<Button x:Name="Cancel" Content="Cancel" Width="100" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
<ContentControl cal:View.Model="{Binding TimeSpanViewModel}"/>
</Grid>
</UserControl>
Es ist nur ein Wrapper mit einem in Ordnung und Abbruchtaste für einen bereits vorhandenen Viewmodel (wer Ansicht von Caliburn gelöst ist, also dachte ich ich tue Ansichtsmodell zuerst). Wenn ich diese cal:View.Model
Bindung entferne, erhalte ich tatsächlich die Fähigkeit, mein Dialogfeld zu schließen, aber ich verliere den ganzen tatsächlichen Inhalt. Ich verwende das ContentControl, um Dinge in meiner gesamten Anwendung anzuzeigen (in ItemsControls, Dialogfeldern, Pop-ups usw.).
Meine Frage ist, wie sollte ich ein ViewModel in einem ViewModel ersten Caliburn anzeigen?
Edit: Ich bin die Anzeige der DialogViewModel (die Bildschirm erbt) wie das Windowmanager mit so:
[Export(typeof(IWindowManager))]
public class AppWindowManager : MetroWindowManager, IDialogManager
{
AppViewModel Content { get; set; }
public AppWindowManager()
{
}
public override MetroWindow CreateCustomWindow(object view, bool windowIsView)
{
if (windowIsView)
{
return view as MainWindowContainer;
}
MainWindowContainer window = new MainWindowContainer();
//{
window.Content = view;
//};
return window;
}
public override bool? ShowDialog(object rootModel, object context = null, IDictionary<string, object> settings = null)
{
Window window = CreateWindow(rootModel, true, context, settings);
return window.ShowDialog();
}
public object ShowCustomDialog(object rootModel, string title, bool showWindowsOptions = true)
{
dynamic settings = new ExpandoObject();
settings.Title = title;
settings.ShowCloseButton = showWindowsOptions;
settings.ShowMaxRestoreButton = showWindowsOptions;
settings.ShowMinButton = showWindowsOptions;
settings.SizeToContent = SizeToContent.WidthAndHeight;
return ShowDialog(rootModel, null, settings);
}
public ILoadingDialogViewModel CreateLoadingDialogManager()
{
return new LoadingDialogViewModel(this);
}
}
Wahrscheinlich sollten Sie weitere Details hinzufügen: Sind Sie ein 'conductor' mit Ihrem Dialog angezeigt werden? Welches Problem hast du mit "TryClose"? Siehst du die gleiche Botschaft von der anderen Frage? –
Dies ist das Ansichtsmodell zuerst, da Sie kein Benutzersteuerelement zum Angeben der Ansicht verwenden und eine Sicht in das Inhaltssteuerelement basierend auf dem Ansichtsmodell laden. Es wird nur zuerst angezeigt, wenn Sie ein Benutzersteuerelement bereitstellen, an das Sie ein Anzeigemodell an/für binden/erstellen möchten. Hat Ihr Kind viewmodel einen Candeactivate Hook? – Charleh
Das untergeordnete Element (TimeSpanViewModel) erbt PropertyChangedBase, und das Dialogfeld ViewModel, das es hostet (siehe obigen Code), implementiert Screen. Ich habe Deaktivierungshaken bei der Kalibrierung nicht berührt. – Joe