MVVM ViewModel 和 属性 (PresentationCore.dll ) 的类型

MVVM ViewModel and type of property (PresentationCore.dll )

我们可以在我的 ViewModel 中使用针对 UI /UI 框架的程序集中的 类 吗?

今天我讨论了一个 question 问题,其中一个人非常坚持 PresentationCore.dll 中的 类 不能在 ViewModel 中使用。(好像他有从来没有使用过 ICommand)但是是这样吗?

据我了解,MVVM 只是一种用于 View 和 ViewModel 解耦的模式?它没有说明我可以在 ViewModel 中使用什么类型的 类 只要它们不创建视图(ViewModel 没有直接引用视图或任何关于视图的具体实现或类型)。

请不要回答什么是好的做法,我只是想弄清楚 MVVM。

有时 MVVM 看起来像是有自己趋势的宗教。 :)

以下是 MVVM 教派成员之间圣战的主题:

  • 先查看与先查看模型;
  • do/don不公开视图模型中的 PresentationFramework/WindowsBase 类型;
  • do/don不通过视图模型公开模型,而是将视图直接绑定到模型;
  • 转换器与视图模型属性;
  • 在视图模型中聚合模型/将模型数据映射到视图模型;
  • 使用事件聚合器/使用服务。

最危险的是 "pure MVVM" 狂热分子。没有人确切地知道 "pure MVVM" 是什么,但如果你违背了他们的信念,他们随时准备烧死你。

MVVM 只是希望您将视图 logic 与视图模型 logic.
分开 就这些了

上面的列表只是一组方法,而不是教条。而且,实际上,它们都适合 MVVM。用不用只是方便和当前项目架构的问题。

来自上一个 question/answer 的简单示例:SolidColorBrush

此类型在两个不同的程序集中声明:Windows.Foundation.UniversalApiContract(UWP 应用程序)和 PresencationCore.dll(WPF)。它们都是不同的类型,具有不同的命名空间和不同的身份(类型的身份与其程序集耦合。

TypeA 程序集 A 不同于程序集 B 中的类型 A。您不能将 AssemblyA.TypeA 传递给期望 AssemblyB.TypeA

的对象

为什么重要?

以那个ViewModel为例

// WPF namespace
using System.Windows.Media;

public class ExampleViewModel : ViewModelBase
{
    public SolidColorBrush Color { get; set; }
}

当您在 WPF 中使用它时,一切都很好并且可以正常工作。现在你想制作一个 UWP 应用程序,但这是行不通的。 UWP 不知道来自 PresentationCore.dll 的 System.Windows.Media.SolidColorBrush。它只知道Windows.Foundation.UniversalApiContract.dll中的Windows.UI.Xaml.Media.SolidColorBrush,即使它们具有相同的方法、相同的参数甚至相同的实现,它们也是不同的。

更糟糕的是,因为您的 ViewModel requires PresentationCore.dll,它必然绑定到 .NET 3.x 或 4.x,而 UWP 基于 WinRT/Core框架。

这是一个紧耦合。现在假设您还想使用 Xamarin(基于 mono 的跨平台 .NET 框架)并且 SolidColorBrush 在 Xamarin.Forms.dll 中(我没有使用 Xamarin,我不确定它是否有此类名称的类型)。

Linux/Mono版本怎么样?单声道没有 WPF。控制台应用程序?他们甚至不使用 UI 元素。

然后你不能绑定它,你最终会复制你的 ViewModels 和复制你的表示逻辑等。

通过您的 "MVVM" 方法,您提高了可测试性,但没有实现可重用性和解耦。

没有规格告诉您:"This must be done so and so."。 MVVM 没有规范,它是一种(架构)模式。

对于上述示例,如果您需要确定颜色,您可以使用非 ui 特定类型(stringColor 或您自己的颜色实现class/struct)。

对于视图,您实现了“IValueConverter”(参见 this answer 示例)。

现在您拥有了可以重复使用的漂亮、解耦的代码,并且每个 UI 平台都可以以自己的方式处理颜色。

而且只需几行代码就可以直接返回SolidColorBrush那么简单。最好的是,您可以在任何地方和您创建的每个应用程序中重复使用 ColorToSolidColorBrushValueConverterColorToSolidColorBrushValueConverter 不依赖于您的特定应用程序,您的 application/view 模型也不依赖于它。

写出好的代码并不难,你只需要尝试一下;)

请浏览以下链接:

The MVVM Pattern

MVVM Basics

属性 类型没有这样的限制。此模式仅通过使用 ViewModel 层解耦 视图和模型。