WPF MVVM 窗口导航



我正在将MVVM模式应用于我的应用程序,该应用程序将有数十个屏幕(与ViewModels相关)。现在我被困在一个非常简单的点上...谁负责创建新窗口,实例化视图模型并将一个分配给另一个窗口?

我认为在视图甚至视图模型中这样做是错误的。我看到很多回复建议使用外部框架,这对我来说不是一个选择。

你觉得怎么样?

官方的Windows推荐是什么?

这是我

所做的:

    1 个主
  • 窗口,主视图模型作为应用程序根目录
  • 在需要时使用视图模型登录视图
  • 查看所有子模块/模块的模型优先方法
  • 对话服务视图为对话框驱动的模型
  • 窗口
  • 服务视图为窗口驱动的模型

主视图模型通过 MEF 组成模块。

让我们尝试一个例子:用户单击一个按钮,并显示一个确认对话框,其中包含"是/否"。通常,您会在按钮的事件处理程序中引发通知:

private void Button_Click(object sender, MouseRoutedEventArgs e)
{
    var result = MessageBox.Show("Confirm?", MessageBoxButton.YesNo);
    if (result == true)
        //something
    else
        //something else
}

现在,由于我们有 MVVM,因此必须将业务逻辑(此处为 if/else)移动到 ViewModel 中。但 UI 必须保留在 UI 控件上!假设这是视图模型:

public class VM
{
    public void DoSomething()
    {
        //raise the confirmation interaction
    }
}

视图模型不能拥有 UI...但可以拥有与用户所需的交互的牵引力。

这可能是交互的界面:

public interface IConfirmationInteraction
{
    bool? RaiseConfirmationRequest(string message);
}

因此,视图模型可以具有如下属性:

public IConfirmationInteraction ConfirmInteraction { get; }

VM不实例化它,VM接受其他人传递的接口实例。例如在构造函数中:

public VM(IConfirmationInteraction confirmInteraction)
{
    if (confirmInteraction == null)
        throw new ArgumentNullException(nameof(confirmInteration));
    ConfirmInteraction = confirmInteraction;
}

所以它的方法可以变成:

public void DoSomething()
{
    var result = ConfirmInteraction.RaiseConfirmationRequest("Confirm?");
    if (result == true)
        //do something
    else
        //do something else
}

用户界面呢?您可以创建使用 UI 元素的具体交互:

public class UIConfirmationInteraction : IConfirmationInteraction
{
    public bool? RaiseConfirmationRequest(string message)
    {
        return MessageBox.Show(message, MessageBoxButton.YesNo);
    }
}

你明白重点了吗?我们已经保存了模式:ViewModel 与逻辑一起行动,将不同的抽象放在一起,但对实现、消息框、按钮等一无所知。可以将这些交互实现为 UI 交互,例如在拥有 UI 控件的构造函数中VM

public class MyControl : USerControl
{
    public MyControl()
    {
        DataContext = new VM(new UIConfirmationInteraction());
    }
}

但您也可以将它们实现为自动结果,例如,当您想要运行测试列表以尝试默认答案"是"或默认答案"否"时:

public class YesConfirmationInteraction : IConfirmationInteraction
{
    public bool? RaiseConfirmationRequest(string message)
    {
        return true;
    }
}

这称为"依赖注入"。 在谷歌上试试,你可以找到几十个教程。在本例中,我通过构造函数构建了一个依赖项注入。

这是一种可靠的方法,您可以通过 ViewModel 手动构建 UI 控件之间的所有桥,但保留模式。

相关内容

  • 没有找到相关文章

最新更新