c# - 从 ViewModel 打开一个窗口

标签 c# wpf mvvm

我正在尝试使我的 WPF 应用程序解耦,因此我做了类似的事情:

  • View 的项目。
  • ViewModel 的项目。

  • 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}}" 
            />
    

    然后我建议您开始使用对话服务 - 这是一些与对话相关的代码,被抽象为独立的辅助样式服务。进入对话服务的细节会使这个答案有点长,所以这里有一些有用的链接可以帮助你入门:
  • Standard Approach of Launching Dialogs/Child Windows from a WPF Application using MVVM
  • Showing Dialogs When Using the MVVM Pattern in WPF or UWP

  • 如果您将新的对话服务与使用 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/

    相关文章:

    c# - 绑定(bind)到绑定(bind)元素?

    c# - 任务取消暂停 UI

    c# - 获取 ListView 的选定项目(MVVM、Caliburn.Micro)

    c# - DataGridVIew填充了匿名类型,如何过滤?

    c# - 用于 IEnumerable<string> 的 Visual Studio 可视化工具

    c# - 是否可以不指定工作表名称和列?

    c# - 如何为返回 IEnumerable 的方法编写测试

    c# - WPF + PostSharp’ed View 模型在一分钟内就卡住了

    c# - 使用 WPF 工具包绑定(bind)饼图不显示点

    当绑定(bind)在 DataGridTextColumn 中时,WPF/Xaml Datagrid 不会触发 ValidatesOnDataErros