使用 MVVM 将 GUI 与业务逻辑分离的最后步骤?

Posted

技术标签:

【中文标题】使用 MVVM 将 GUI 与业务逻辑分离的最后步骤?【英文标题】:Final steps in using MVVM to decouple GUI from business logic? 【发布时间】:2010-01-13 21:07:41 【问题描述】:

就在最近,我了解了使用 MVVM 将 GUI 与底层模型分离。我最终尽可能多地学习将我当前的应用程序转换为 MVVM,并且在很大程度上取得了成功。现在我需要弄清楚如何实际使用在 Blend 中生成的 GUI 并使用它来代替我在 Visual Studio 中设计的当前 GUI。我在网络上找不到任何资源来尽可能无缝地实现这一点。我想知道你们都做了什么,并为你们工作。

我的最终解决方案是允许我在运行时从菜单中选择一个皮肤,并立即将 GUI 从当前的一个更改为用户选择的另一个。 谁能指点我解释如何做到这一点的帖子?

我目前的目标没有那么雄心勃勃——我希望能够将我的新 Blend GUI 添加到我的 Visual Studio 项目中,并且在我编译时,让新的 Blend GUI 出现。如果我想回到旧的 GUI,我将不得不重新编译。目前,没关系。

我已将我的 Blend 项目添加到我的 VS2008 解决方案中,并将其设置为启动应用程序。这很好——如果我运行应用程序,我的新 GUI 会出现而不是旧的。现在的问题是它需要实际上位于不同文件夹中的 DLL——原始启动应用程序的 bin\Debug 文件夹。 我是否应该将我原来的 GUI 作为启动应用程序,然后让它的应用程序代码隐藏加载另一个 GUI?

此外,每个各自的 GUI 都需要对 ViewModel 的引用。就我而言,我只是在我当前的 GUI 类中实例化它。对于 Blend GUI,我也在那里实例化了一个,因为只有一个 GUI 将处于活动状态。 这是应该使用 Unity 框架之类的地方吗?

对于所有可能不连贯的问题,我很抱歉,但我不太确定我应该如何从这里着手。我觉得我已经非常接近向自己证明,从 GUI 的角度来看,MVVM 是一种可行的方法(我已经在可测试性位上卖了)。

【问题讨论】:

【参考方案1】:

我见过的所有示例都通过使用某种形式的 ResourceDictionary 交换来动态切换 GUI 外观。几个链接:

Load XAML Resource Dictionaries at Runtime

WPF change theme/style at runtime

希望对您有所帮助。

【讨论】:

谢谢,今晚我会看看那些链接! 嗯...我不应该说“皮肤”。我并不想只更改 UI 元素的 chrome —— 布局(在我看来)非常不同,以至于我认为更改模板等无法覆盖它们。然而,在某些时候我也想要动态皮肤,所以这仍然是非常有用的信息。所以在这一点上,我真的需要弄清楚当我在 Visual Studio 中启动时如何让我的新 GUI 启动,同时能够访问我以前的 GUI 的 bin\Debug 文件夹中的文件。不幸的是,仅仅设置工作目录是不够的。【参考方案2】:

我发现了一个错误,在我的代码的一部分中,我使用了错误的属性来获取当前运行的程序集的路径。我现在正在使用

System.Reflection.Assembly.GetExecutingAssembly().Location

虽然这确实有效,但仅当我将 exe 从 Blend 项目的 bin\Debug 文件夹复制到我的主应用程序的 bin\Debug 文件夹时才有效。我猜我将不得不使用构建后事件来忍受这个。在过去几个月使用 .NET 时,我被宠坏了,我不必这样做(就像以前在 C++ 中一样),因为所有引用的程序集都会自动复制过来。如果我想调试任何代码隐藏,我还必须在 Blend 项目的设置中设置启动可执行文件,这也很不方便,尤其是在路径设置不同的不同计算机上工作时。这里的任何建议也将不胜感激!

【讨论】:

为澄清起见,我接受了我自己的答案作为答案,因为事实证明确实不需要做任何事情来支持我正在寻找的东西。我刚刚遇到配置错误并且从错误的目录中读取,这就是为什么我的数据绑定控件没有显示任何内容。与 MVVM 解耦真的很管用!

以上是关于使用 MVVM 将 GUI 与业务逻辑分离的最后步骤?的主要内容,如果未能解决你的问题,请参考以下文章

MVVM:GUI 和 ViewModel 之间的真正分离

iOS 中 MVVM

1.1 vue里面的mvvm模式是什么?

浅谈针对DELPHI的界面和业务的分离开发模式和MVC模式

mvvm框架是啥 它和其他框架的区别

MVC和MVVM