这是一个需要在单篇文章中回答的广泛问题。我将提供一些可以考虑和研究的内容。
(注意:本帖中的所有代码都是凭记忆自由书写的,可能不是100%的语法正确。)
你对MVVM的定义大多是正确的。对我而言,MVVM和MVC的主要区别在于绑定(binding)用于将View连接到View Model(Controller)。但这只是语义上的区别,我们不需要纠结于此。
无论你使用WP 7、WP 8、WP8.1、Siverlight还是Universal App,都不重要。最好从WPF开始,因为那是MVVM被引入的时候,它运行起来也更快,因为不需要在模拟器中运行应用程序。
首先要做的是从一个非常基本的示例开始。
1)创建“Views”和“ViewModels”两个文件夹。严格来说并不需要,但你肯定会需要它们。
2)创建一个带有TextBlock的空白页面。把它放在Views文件夹下并命名为MyFirstPage。在上面放置一个文本块,如下所示:
<TextBlock Text="The Title of my App" />
3) 运行该应用并确保该文本已显示。
4) 创建一个ViewModel类。这是一个基本的类文件。在ViewModels文件夹中创建它,并将其命名为MyFirstViewModel。
5) 将页面(View)连接到ViewModel。以下是我的code behinds代码,大部分情况下这就是我其中的全部内容。将DataContext设置为ViewModel是设置绑定的关键。虽然有许多其他框架可以实现此魔法,但这是发生的事情。在我看来,这是开始的最佳地点。
public class MyFirstPage : Page
{
private MyFirstViewModel _viewModel = new MyFirstViewModel();
public MyFirstPage()
{
this.Initialize???
this.DataContext = _viewModel;
}
6)为您的视图模型添加一个标题属性,现在只需返回一个硬编码的值。
public string Title { get { return "The Title of my App (set from View Model)"; } }
7)更新视图中的TextBlock以使用数据绑定
<TextBlock Text="{Binding Title}" />
8) 运行应用程序以测试其是否正常工作。
这就是将视图模型连接到视图并查看绑定工作的基础知识。
接下来要学习的内容:
双向绑定: 如果您在TextBox中设置UI上的值,则需要更新绑定,使其看起来像{Binding FirstName,Mode=TwoWay},例如如果您想输入名字。
可观察属性: 您会发现另一个问题是当您的视图模型逻辑更改绑定属性的值时,这些值不会显示在UI上。您会为此感到苦恼,而且你会想知道其中的问题,但实际上非常简单。UI需要被通知来更新。您已更改了底层值,但UI不知道如何更新。因此,对于像FirstName这样的属性,您需要在ViewModel上实现INotifyPropertyChanged,并在属性的setter中调用OnPropertyChanged("FirstName")。 有很多描述此内容的示例。
ObservableCollections: 与Observable Properties类似,如果您在视图模型中调整了项目列表,则需要通知视图该列表已更改。方法是将属性变为空ObservableCollection。再次,有许多示例。 我的提示是仅为这些属性实现getter。您希望在构造函数中创建集合一次,或者在属性的getter中进行惰性加载。如果您曾经创建ObservableCollection的新实例,则与UI的链接将断开,您将不得不调用OnPropertyChanged,但如果仅使用单个ObservableCollection实例并将其从中删除项目,则不需要这样做。玩了一会儿,你就会明白我的意思。再次阅读本文。
转换器: 现在我们正在进入下一个级别,但为了使代码干净,您将利用转换器和Relay Commands。 最常见的转换器是BooleanToVisibilityConverter。 这将根据View Model上的布尔值控制视图组件的可见性。 再次,您必须研究此内容。
Relay Commands: 像转换器一样,您需要Relay Commands来保持代码简洁。 Relay Command基本上是单击事件的绑定。 您将在ViewModel中实现Relay Command,例如Button Command将绑定到View Model上的RelayCommand属性。
一旦您研究并熟悉了这些项,您就可以开始好的开端了。
在某些情况下,避免编写代码很难,但我发现我已经能够找到大多数问题的解决方案。然而,有时需要创造力。
最后一个评论:我创建严格的干净ViewModel的目标是,以便我可以在不同设备之间进行重用(手机和平板电脑)。这是可能的,但深入到更难的问题后就更加困难了。但是,关键在于您必须为您的ViewModels创建一个单独的Lib项目。所有我的解决方案都有Windows Phone 8.1项目、Windows 8.1(Store)项目和Portable类Lib项目。 ViewModels文件夹放入Lib项目中,以及所有其他可共享的代码。为使所有内容正常工作,您可能必须使用Inversion of Control,但这是另一个帖子的主题。
祝好运,玩得开心,
Tom