我只想知道我是否做对了。我有一个主 View (MainView)及其 View 模型(MainWindowViewModel)。在MainView中,有一个按钮可以调用另一个 View (SubView)。 SubView还具有ViewModel(SubViewModel)。通过其 View 模型关闭SubView之后,我想从mainviewmodel访问subviewmodel中的属性。
从mainviewmodel调用 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模式吗,还是有更好的方法来实现我想要的?

最佳答案

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

不,您没有正确遵循MVVM的核心原则,并且有一种更好的方法来实现所需的功能(如果我正确理解了所需的功能)。

首先,MVVM来自使所有层都可测试而不需要了解“之上”层的需求。例如,您的应用程序应该能够仅通过Model进行技术上应做的一切;它应该能够根据需要检索,更新和创建数据-即使此数据尚未以用户直观的方式呈现。

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

然后,当您将 View 放在首位时,您所需要做的就是数据绑定(bind)和事件处理,您就可以开始工作了! (大多)...

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

因此,我将从翻转您的代码开始,以便“ View ”控制在任何给定时间处于 Activity 状态的 View ,并且每个 View 都注意其自身的数据上下文以及使用它们的方法。

(现在,在SO社区对我不讲任何关于VM优先方法的说法之前,现在是这样。您可以尝试VM优先方法,但是一开始很难理解,您将要使用可以帮助您的框架,例如Caliburn.Micro或MVVMLite等)

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

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

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

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

10-12 22:32