2

我只是想知道我是否做得对。我有一个主视图(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-pattern,还是有更好的方法来实现我想要的?

4

2 回答 2

3

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

在本例中,您MainViewModel需要直接了解 View 层 ( SubView),这通常会尽可能避免。

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

于 2013-01-29T20:06:21.307 回答
3

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

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

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

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

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

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

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

(现在,在 SO 社区对我说没有关于 VM 优先方法的任何内容之前 - 就是这样。你可以尝试 VM 优先方法,但一开始更难理解,你会想要使用一个可以帮助你的框架,比如 Caliburn.Micro 或 MVVMLite 什么的)

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

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

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

于 2013-01-29T20:41:41.933 回答