【发布时间】:2026-01-28 10:55:01
【问题描述】:
我之前已经有人帮忙了,但是现在我将所有内容都重写到 MVVM 中,我失去了这样做的能力......再次!
预MVVM重写,我的页面后面的代码中有这行代码:
var window = MahApps.Metro.Controls.TreeHelper.TryFindParent<MetroWindow>(this);
最后,“this”表示页面。现在,这段代码位于我的视图模型中,带有一条弯曲的红线,我不知道用什么替换它。我想我不能说:
SideBar sb = new SideBar();
var window = MahApps.Metro.Controls.TreeHelper.TryFindParent<MetroWindow>(sb);
因为这会创建一个新的侧边栏实例...不是吗?顺便说一句,此页面作为主页中框架的默认源加载,而不是通过代码启动。
【问题讨论】:
-
永远不要尝试像这样 1:1 重写代码...您的视图模型根本不应该调用这样的任何方法!重新考虑你的方法,因为 MVVM 不是
take my code from codebehind and put it into a separate class。 -
大部分我都没有这样做...但是我完全不熟悉这行中发生的事情...我想达到同样的效果。你知道我能做些什么吗?
-
它显然试图找到对象的父对象,在这种情况下是页面的父对象,这将是窗口......不知道你以后如何在代码中使用它,但是您的 ViewModel 不应该知道任何关于窗口或页面的信息。如果您甚至需要它,您需要将该逻辑放在其他地方......
-
下一行代码是:await DialogManager.ShowMessageAsync(window, "MESSAGE HERE");据我所知,在不知道窗口的情况下无法调用它......而且我不知道这段代码还能去哪里?
-
它应该通知其他类来显示消息,但它不应该直接负责处理这样的事情。据它所知,它只会触发显示一条消息,但这取决于其他人。 ViewModel 不应该关心它是 WPF 消息框,还是网站 javascript 弹出窗口,甚至是一些控制台输出。这就是 MVVM 的意义所在——分离层和关注点以使代码可测试、可管理和可重用。尽可能避免紧密耦合。如何准确地实现这一点是一个长期讨论的问题,并且没有明确的答案。
标签: c# wpf mvvm mahapps.metro