我们可以在ViewModel中使用针对UI / UI框架的程序集中的类吗?
今天我讨论了question,其中一个人非常执着,不能在PresentationModel中使用来自PresentationCore.dll的类。(好像他以前没有使用过ICommand)但是正确?
由于我理解MVVM只是一种解耦View&amp;的模式。视图模型?它没有说明我可以在ViewModel中使用什么类型的类,只要它们不创建视图( ViewModel没有直接引用视图或任何有关视图的特定实现或类型的知识< /强>)。
请不要回答好的做法,我只想清楚MVVM。
答案 0 :(得分:5)
有时MVVM看起来像宗教一样有自己的趋势。 :)
以下是MVVM教派成员之间神圣战争的主题:
PresentationFramework
/ WindowsBase
类型; 最危险的是“纯MVVM”狂热分子。没有人确切地知道,“纯MVVM”是什么,但是如果你违背他们的信念,他们已经准备好烧你了。
MVVM只是希望您将视图逻辑分别与视图模型逻辑保持一致。
这就是。
上面的列表只是一组方法,而非dogmata。实际上,它们都适合MVVM。使用或不使用只是方便和当前项目架构的问题。
答案 1 :(得分:1)
答案 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特定类型(string
,Color
或您自己的颜色类/结构实现。
对于视图,您实现了一个`IValueConverter'(例如,参见this answer)。
现在你有了漂亮的解耦代码,你可以重复使用,每个UI平台都可以用自己的方式处理颜色。
就像以几行代码为代价直接返回SolidColorBrush
一样简单。最好的是,您可以在任何地方以及您创建的每个应用程序中重用ColorToSolidColorBrushValueConverter
。 ColorToSolidColorBrushValueConverter
不依赖于您的特定应用程序,您的应用程序/视图模型也不依赖于它。
编写好的代码并不难,你只需要尝试一下;)