我只是想知道我是否正确行事。我有一个mainview(MainView)和它的viewmodel(MainWindowViewModel)。在MainView中有一个按钮来调用另一个视图(SubView)。 SubView还有一个ViewModel(SubViewModel)。通过它的viewmodel关闭SubView之后,我想从mainviewmodel访问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模式,或者是否有更好的方法来实现我想要的?
答案 0 :(得分:3)
目前还不完全清楚你想要什么 - 但这绝对违反了MVVM的纯粹意义。
在此示例中,您的MainViewModel
需要直接了解视图层(SubView
),这通常会尽可能避免。
然而,避免这种情况的最佳方法在很大程度上取决于您是否使用框架(许多框架具有用于将View与ViewModel匹配的工具,以及显示对话框等),哪个框架以及您是否是工作View-first或ViewModel-first。
答案 1 :(得分:2)
对于你的核心问题:“我是否正确地使用mvvm模式,或者是否有更好的方法来实现我想要的?”
不,你没有正确地遵守MVVM的核心原则,并且有更好的方法来实现你想要的东西(如果我理解你想要什么)。
首先,MVVM需要在不需要“上面”层的情况下使所有层都可测试。例如,您的应用程序应该能够在技术上通过模型完成它应该做的所有事情;它应该能够根据需要检索,更新和创建数据 - 即使这些数据不是以用户直观的方式呈现的。
其次,您的应用程序应该能够在技术上完成用户希望它通过View-Model执行的所有操作,但不需要任何UI。因此,您应该能够“查看”您的数据并执行各种程序功能,例如保存。
然后,当您将视图放在顶部时,您只需要数据绑定和事件处理,您就可以开始了! (大部分)...
主要是,View有责任从ViewModel正确管理自己的DataContext;将datacontext推送到特定视图不是ViewModel的工作。查看它的另一种方法是,View访问ViewModel中的方法和属性,以明确用户界面中用户请求的工作。
所以,我首先要翻转代码,以便View控制哪些视图在任何给定时间都处于活动状态,并且每个视图都包含它自己的数据上下文,以及使用它们的方法。
(现在,在SO社区向我跳过关于VM没有说出第一个方法的任何内容之前 - 就在这里。你可以尝试VM的第一种方法,但是一开始就更难理解,你要去想要使用框架来帮助你,比如Caliburn.Micro或MVVMLite或其他东西)
因此,对于View First,您要做的是让MainView知道如何使用SubView填充自身。 MainView的工作是确保它的数据上下文是正确的MainViewModel,因为每个SubView都是在MainView中创建的,MainView将确保每个SubView都有正确的SubViewModel实例设置为它的数据上下文。
这个应该在逻辑上容易接近,因为你的MainViewModel里面已经包含一组SubViewModel(各种类型)。
希望有助于您前进,如果您有更具体的代码问题(带示例代码),我们可以为您提供更多帮助。