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

时间:2016-01-29 12:25:20

标签: c# wpf mvvm data-binding binding

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

今天我讨论了question,其中一个人非常执着,不能在PresentationModel中使用来自PresentationCore.dll的类。(好像他以前没有使用过ICommand)但是正确?

由于我理解MVVM只是一种解耦View&amp;的模式。视图模型?它没有说明我可以在ViewModel中使用什么类型的类,只要它们不创建视图( ViewModel没有直接引用视图或任何有关视图的特定实现或类型的知识< /强>)。

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

3 个答案:

答案 0 :(得分:5)

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

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

  • 首先查看第一个视图模型;
  • 执行/不显示视图模型中的PresentationFramework / WindowsBase类型;
  • 执行/不通过视图模型公开模型,并将视图直接绑定到模型;
  • 转换器与视图模型属性;
  • 在视图模型/地图模型数据中聚合模型以查看模型;
  • 使用事件聚合器/使用服务。

最危险的是“纯MVVM”狂热分子。没有人确切地知道,“纯MVVM”是什么,但是如果你违背他们的信念,他们已经准备好烧你了。

MVVM只是希望您将视图逻辑分别与视图模型逻辑保持一致。

这就是

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

答案 1 :(得分:1)

请浏览以下链接:

The MVVM Pattern

MVVM Basics

财产类型没有这种限制。此模式仅使用ViewModel图层解耦视图和模型。

答案 2 :(得分:-1)

上一个问题/答案中的简单示例:SolidColorBrush

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

TypeA程序集A与assemblyB中的TypeA不同。您无法将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需要PresentationCore.dll,它必然与.NET 3.x或4.x相关联,而UWP则基于WinRT / Core Framework。

这是一种紧密耦合。现在假设您还想使用Xamarin(基于单声道的Crossplatform .NET框架)和SolidColorBrush即Xamarin.Forms.dll(我没有使用Xamarin,我不确定它甚至有一个这种名称的类型)。

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

然后你无法绑定它,你最终会重复你的ViewModel并复制你的表示逻辑等。

使用“MVVM”方法,您提高了可测试性,但没有归档可重用性和解耦。

没有规范告诉你:“必须这样做。” MVVM不是规范,它是(架构)模式。

为了上述示例,如果需要确定颜色,请使用非ui特定类型(stringColor或您自己的颜色类/结构实现。

对于视图,您实现了一个`IValueConverter'(例如,参见this answer)。

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

就像以几行代码为代价直接返回SolidColorBrush一样简单。最好的是,您可以在任何地方以及您创建的每个应用程序中重用ColorToSolidColorBrushValueConverterColorToSolidColorBrushValueConverter不依赖于您的特定应用程序,您的应用程序/视图模型也不依赖于它。

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