c# - MVVM 模式的正确使用

标签 c# mvvm

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

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-pattern 是否正确,或者是否有更好的方法来实现我想要的?

最佳答案

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

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

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

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

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

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

因此,我将从翻转您的代码开始,以便 View 控制在任何给定时间哪些 View 处于事件状态,并且每个 View 都知道它自己的数据上下文以及使用它们的方法。

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

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

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

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

关于c# - MVVM 模式的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14591208/

相关文章:

android - MVVM - 实现谷歌地图并在 ViewModel 中拥有上下文?

c# - 如何避免在 XAML/Mvvm/C# 中双击按钮

wpf - 如何从另一个 ViewModel 访问 ViewModel 的属性?

c# - 为什么 .NET Core 中缺少 List<T>.ForEach?

c# - 在 C# 中,是一个声明为 : int[]a = {numbers . ..} 的数组;在堆栈中?

c# - 使用合并 (SimpleField) 字段从 .dotx 生成 .docx

c# - 数据绑定(bind) ListBox SelectedItems 属性

c# - 为模板动态创建通用类型

c# - 可能的?修改加载的 C# DLL?

wpf - 绑定(bind) UserControl 依赖属性和 MVVM