gpt4 book ai didi

c# - MVVM 模式的正确使用

转载 作者:行者123 更新时间:2023-12-03 23:13:06 27 4
gpt4 key购买 nike

我只想知道我做的是否正确。我有一个主视图 (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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com