我正在尝试使我的 WPF 应用程序解耦,因此我做了类似的事情:
在
mainwindow
我将按钮绑定(bind)到 OpenChildWindowCommand
它位于 ViewModel DLL 中。OpenChildWindowCommand
继承自 ICommand
并调用 OpenChildWindow
MainViewModel
中的方法.现在的问题是
ViewModel
不知道ChildWindow
因为它是一个不同的DLL。我要问的是:最好的方法是什么 - 将打开子窗口?
也许他们之间有某种消息传递。
最佳答案
首先,我祝贺您在物理上将您的 View 与您的 View 模型分开 - 将它们保持在同一个程序集中会导致许多人采取他们不应该采取的捷径。
使用您的按钮绑定(bind),我建议您将命令代码放在 View 后面的代码中。这是与导致子窗口打开的 View 的交互,因此命令代码基本上没有理由需要在 View 模型中。您的代码将如下所示:
public ICommand OpenChildWindowCommand
{
get
{
return new DelegateCommand<object>(ExecuteOpenChildWindowCommand, CanOpenChildWindowCommandExecute);
}
}
private void ExecuteOpenChildWindowCommand(object context)
{
...code to open the child window...
}
private void CanOpenChildWindowCommandExecute(object context)
{
return true;
}
(
DelegateCommand<T>
来自 Microsoft 的 PRISM 库)。您的 XAML 将如下所示:<Button x:Name="MyButtonName"
Command="{Binding OpenChildWindowCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
/>
然后我建议您开始使用对话服务 - 这是一些与对话相关的代码,被抽象为独立的辅助样式服务。进入对话服务的细节会使这个答案有点长,所以这里有一些有用的链接可以帮助你入门:
如果您将新的对话服务与使用 IoC 容器相结合,那么您可以拥有一些非常好的解耦 MVVM 并测试友好的代码,如下所示:
public class MyMainWindow
{
private IDialogService dialogService;
public MyMainWindow(IUnityContainer container)
{
dialogService = container.Resolve<IDialogService>();
}
private void ExecuteOpenChildWindowCommand(object context)
{
var dlg = _dialogService.Show<IMyDialogWindow>();
}
}
(您在应用程序启动的早期初始化容器并将接口(interface)注册到具体的类映射)。
关于c# - 从 ViewModel 打开一个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40761164/