问题描述
我正在使用 Caliburn.Micro 4.0.136-rc 并且想要显示一个对话框,要求用户输入。
我找到的所有答案都是几年前的,使用 CM 中不再提供的类。其他链接到死网站上的解决方案。
我使用的是从 Screen 继承的 viewmodel。如何使用 CM 和 MVVM 创建和显示对话框?
解决方法
我发现了 2 种使用 Caliburn.Micro 显示对话框的可能方法
IWindowManager
我使用的是 IoC,所以我通过构造函数将 IWindowManager 注入到 ViewModel。
有了这个引用,就可以调用 ShowDialogAsync() 并从对话框中指向 ViewModel。这是重要的部分:
private readonly IWindowManager _windowManager;
public ShellViewModel(IWindowManager windowManager)
{
_windowManager = windowManager;
}
protected override async void OnViewLoaded(object view)
{
await Task.Delay(1500);
await _windowManager.ShowDialogAsync(new UsrControlViewModel());
}
MaterialDesignInXAML
在我的项目中,包 MaterialDesignInXAML 已经使用,所以这可能不是每个人都能接受的。
这是对话框的文档部分:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/wiki/Dialogs
我发现了一个问题,描述了如何使用 MaterialDesignInXAML 显示对话框,并且该绑定在 Caliburn.Micro 中失败。虽然这似乎是 Caliburn.Micro 的问题,但 Keboo 提供了一种解决方法。
主题:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/issues/1085
从那个线程来看,重要的一点是:
视图模型
public async Task OpenDialog()
{
var viewModel = new UsrControlViewModel();
UIElement uiElement = ViewLocator.LocateForModel(viewModel,null,null);
ViewModelBinder.Bind(viewModel,uiElement,null);
await DialogHost.Show(uiElement,new DialogOpenedEventHandler((sender,args) => viewModel.WithDialogSession(args.Session)));
var result = viewModel.Text;
}
查看
<materialDesign:DialogHost>
<materialDesign:DialogHost.DialogContent>
<ContentControl />
</materialDesign:DialogHost.DialogContent>
<!-- rest of my view -->
</materialDesign:DialogHost>
我将采用第二种方法,因为 MaterialDesignInXAML 已在该项目中使用。