除了单元测试ViewModel之外,我们还有其他原因。
以下是我对人们通常提到的一些优点的问题:
1.松耦合:当我们使用MVVM时,视图依赖于ViewModel而不是视图,为什么它是松耦合的?
2.如果我在代码后台提供公共方法,它们也可以提供可重用性。
我可以回答如何使用MVVM模式。
MVVM在以下情况下更好:
1. 如果多个控件与单个属性绑定。
MVVM:
<TextBlock x:Name="text1" Visibility="{Binding IsSomePropertyTrue, Converter={StaticResource VisibilityConverter}"/>
<TextBlock x:Name="text2" Visibility="{Binding IsSomePropertyTrue, Converter={StaticResource VisibilityConverter}"/>
我可以快速添加类似的控件或删除现有的控件。
与代码后台相比:
public string IsSomePropertyTrue
{
set
{
//...
text1.Visibility = value;
text2.Visibility = value;
}
}
使用单一转换器代替多个转换器
public Brush StateColor { get { if (this.State == State.Edited && this.IsPriority) return new SolidColorBrush(Color.FromArgb(255, 0, 255, 0)); //... } }
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Background="{Binding StateColor}" Text="{Binding State}"/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
3 作为 ListBox 或 DataGrid 等控件中的项模型。例如,如果我想创建一个带有每个项旁边的删除按钮的项目列表,我将创建一个 ItemView 控件和一个 ItemViewModel 类。
<ItemsControl ItemsSource="{Binding SomeItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<view:ItemView DataContext="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
将数据从一个视图复制到另一个视图:
public JournalEntryViewModel(SalesOrderViewModel vm) {}
5个ViewModel可以继承CLR类并实现接口(INotifyPropertyChanged或INotifyDataErrorInfo)。
此外,我使用MVVM来用命令或属性替换事件。使用ViewModels强制按照易懂的名称调用属性。
我认为这是最好的资源之一,如果您想使用和对比MVVM与任何其他模式或没有模式的使用。
http://karlshifflett.wordpress.com/2010/11/07/in-the-box-ndash-mvvm-training/
我是WPF的早期采用者,我可以告诉你我为什么选择了MVVM(这也更或多或少适用于Silverlight)。对于我正在工作的项目,我必须创建一个屏幕,允许用户订阅系统内的通知。这是一个3步骤的过程:
在第一次实现功能后(没有使用MVVM),我被告知我们需要从搜索中排除用户已经订阅的项目。
在进行修复后,我被告知我们需要根据选项为用户提供订阅的实时预览。
那时候,我开始注意到如果我不必处理UI而改变逻辑,一些这些更改可以被提取出来并变得更容易。我从未有意地遵循MVVM,但我意识到我所做的抽象与MVVM模式非常相似。
这就是为什么我推荐使用这种模式。它通过将 UI 逻辑与 UI 本身分离,简化了更改驱动 UI 的逻辑的任务。我还建议您在需要时再实施它。使用 MVVM 是有成本的,但这个成本可以摊销到更改 UI 逻辑的成本中。
没有MVVM,你的Silverlight应用程序代码很快就会变成难以管理的混乱
MVVM 中也有动态自动绑定十分有趣。
想象一下,您的视图模型具有以下属性:bool IsFirstNameVisible、bool IsFirstNameEnabled、string FirstName、double FirstNameWidth等。
在 XAML 文件中,您定义了 x:Name="FirstName" 的 TextBox,并调用您的动态 MVVM 绑定器。它通过反射检查您的视图模型类,查看您定义了哪些属性,并动态地将它们绑定到具有相同名称的控件的类似属性上,如果需要,应用值转换器。
在这种情况下,您可以获得非常干净的 XAML,而不需要使用长达一公里的数据绑定表达式和转换器。
这就是我的 MVVM 库所做的。
关注关注点。分离关注点。
忘记单元测试(我喜欢它;但这不是重点)。忘记可重用性(你真的会重复使用视图模型吗?不,让我们现实一点)。
这是关于分离关注点并将代码和逻辑放在它们应该在的地方。整个想法是可维护性;能够随着时间的推移对代码进行更改,而不会破坏其他东西,也不会使整个代码变成一堆混乱的代码。
MVVM,如果做得正确,可以将您的代码分成有意义的逻辑部分,并允许轻松重构和更改应用程序的要求。当您需要进行更改时,更容易找到何处。尝试编写任何半复杂的应用程序,然后将其保持不变一个月,然后回来尝试进行重大更改。经过合理结构化的应用程序并巧妙地使用MVVM后,即使在停工期后,也更容易理解,并且更容易进行更改。