c# – Caliburn Micro,如何使用ViewModel优先使用ContentControl(或显示’sub’ViewModel)
作者:互联网
我首先使用ViewModel在我的应用程序中使用MVVM框架Caliburn Micro(或者我认为).但是,当我在使用TryClose(true)的对话框出现问题时,无法关闭它的父窗口并偶然发现这个完全概述我的问题的问题,我也得到了“TryClose需要父IConductor或带有Close方法的视图”或IsOpen属性.“:
Caliburn.Micro – ShowDialog() how to close the dialog?
但是,我不确定如何实施该解决方案.答案说明:
Remove the cal:Bind.Model and cal:View.Model bindings…
原来使用这些绑定是View-First方法,我不知道我在做什么.这是我的违规对话框的示例:
<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>
对于已经存在的ViewModel来说,它只是一个包含okay和取消按钮的包装器(谁的视图由caliburn解析,因此我认为我首先在做ViewModel).如果我删除此cal:View.Model绑定我确实恢复了关闭我的对话框的能力,但我放弃了所有实际内容.我正在使用ContentControl来显示我的应用程序(在ItemsControls,对话框,弹出窗口等).
我的问题是,我应该如何在ViewModel首次Caliburn中显示ViewModel?
编辑:我正在使用WindowManager显示DialogViewModel(继承屏幕),如下所示:
[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);
}
}
解决方法:
回答主要问题
how should I be displaying a ViewModel in a ViewModel first Caliburn?
我假设TimeSpanViewModel是ViewModel上的一个属性,它具有[Import](并且ViewModel正在导出自己)?我认为你应该改变cal:View.Model =“{Binding TimeSpanViewModel}”到x:Name =“TimeSpanViewModel”.即使这可能无法解决问题,但这是正确的做法,Caliburn将确保它正确绑定.
我试图重现你的问题,但即使用你的方式它也适合我.那么为什么它不能按照你目前的方式工作,这是一个很好的(第二个)问题.
最大的问题可能是你的AppWindowManager,如果你在那里创建的窗口没有通过正确的Caliburn代码,它将无法正确绑定.由于缺少很多代码,我甚至不确定AppViewModel Content {get;组;在那里做,大多数我可以推测.您是否尝试使用默认的WindowManager实现,只是为了查看它是否可以使用它?
标签:c,mvvm,wpf,caliburn-micro 来源: https://codeday.me/bug/20190623/1268812.html