【问题标题】:MVVM Correct using of the patternMVVM 正确使用模式
【发布时间】:2023-03-11 16:18:01
【问题描述】:

我只是想知道我是否做得对。我有一个主视图(MainView)和它的视图模型(MainWindowViewModel)。在 MainView 中有一个按钮可以调用另一个视图(SubView)。 SubView 也有一个 ViewModel (SubViewModel)。通过它的视图模型关闭子视图后,我想从主视图模型访问子视图模型中的属性。 从 mainviewmodel 调用子视图并访问属性的代码如下所示:

private void SubViewExecute(object parameter)
{
    SubView sub = new SubView();
    bool? result = sub .ShowDialog();
    if (!result.HasValue || !result.Value) return;
    if (sub.DataContext is SubViewModel)
    {
        SubViewModel subViewModel = (sub.DataContext as SubViewModel);
        string property = subViewModel.Property;
    }
}

我的 mvvm 模式是否正确,还是有更好的方法来实现我想要的?

【问题讨论】:

  • 重要提示:永远记住 MVVM 是一组 Guidelines,而不是 Rules,只要是最适合您的,并且保持代码干净且不违反 DRY和 SOLID,没关系.. 只是我的意见,虽然
  • 我具体做的是创建一个枚举 (Dialog, Window, Default, etc) 作为 ViewModels 的一部分,然后 WindowManager 利用这个值来确定是否应该在新的对话框中打开这个特定的 ViewModel,等等。
  • 啊哈!确定何时打开新对话是 View 的工作,而不是 ViewModel。 =)

标签: c# mvvm


【解决方案1】:

对于您的核心问题:“我的 mvvm 模式是否正确,还是有更好的方法来实现我想要的?”

不,你没有正确遵守 MVVM 的核心原则,有更好的方法来实现你想要的(如果我正确理解你想要的)。

首先,MVVM 源于需要使所有层都可测试,而无需了解“上面”的层。例如,您的应用程序应该能够在技术上仅通过模型完成它应该做的所有事情;它应该能够根据需要检索、更新和创建数据——即使这些数据还没有以用户直观的方式呈现。

其次,您的应用程序应该能够在技术上执行用户希望它通过 View-Model 执行的所有操作,但无需任何类型的 UI。因此,您应该能够“查看”您的数据并执行各种程序功能,例如保存。

然后,当您将视图置于顶部时,您所需要的只是数据绑定和事件处理,一切顺利! (大部分)...

主要是View有责任从ViewModel正确管理自己的DataContext;将数据上下文推送到特定视图不是 ViewModel 的工作。另一种看待它的方式是,View 访问 ViewModel 中的方法和属性来执行用户在用户界面中请求的工作。

所以,我将首先翻转您的代码,以便视图控制哪些视图在任何给定时间处于活动状态,并且每个视图都知道它自己的数据上下文以及使用它们的方法。

(现在,在 SO 社区对我说什么不谈 VM 优先方法之前 - 就是这样。你可以尝试 VM 优先方法,但一开始更难理解,你将想用一个框架来帮助你,比如 Caliburn.Micro 或 MVVMLite 什么的)

因此,对于 View First,您要做的是让 MainView 知道如何使用 SubView 填充自身。 MainView 的工作是确保它的数据上下文是正确的 MainViewModel,因为每个 SubView 都是在 MainView 中创建的,所以 MainView 将确保每个 SubView 都具有正确的 SubViewModel 实例集作为它的数据上下文。

应该在逻辑上很容易接近,因为您的 MainViewModel 内部已经包含一组 SubViewModel(各种)。

希望对您有所帮助,如果您有更具体的代码问题(带有示例代码),我们可以进一步帮助您。

【讨论】:

    【解决方案2】:

    这里并不完全清楚你想要什么 - 但这绝对违反了纯粹意义上的 MVVM。

    在此示例中,您的 MainViewModel 需要直接了解视图层 (SubView),通常会尽可能避免这种情况。

    但是,避免这种情况的最佳方法很大程度上取决于您是否使用框架(许多框架具有用于将 View 与 ViewModel 匹配以及显示对话框等的工具)、哪个框架以及您是否使用工作视图优先或视图模型优先。

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多