这是在单个帖子中要回答的广泛问题。我将提供一些要考虑和研究的事情。
(注意:这篇文章中的所有代码都是徒劳的。在语法上可能不是100%正确。)
在很大程度上,您对MVVM的定义是正确的。 MVVM和MVC之间的主要区别是绑定(bind)用于将 View 连接到 View 模型( Controller )。不过这就是语义,不需要挂断它。
无论您是WP 7,WP 8,WP8.1,Siverlight还是Universal App,都没有关系。从WPF开始最容易,因为这是在引入MVVM时开始的,因为它没有在模拟器中运行,所以运行应用程序更快。
首先是从一个非常基本的例子开始。
1)创建文件夹“ View ”和“ViewModels”。完全没有必要,但是您会想要它们。
2)用TextBlock创建一个空白页。这是带有代码的xaml文件。在“ View ”文件夹中创建它,并将其命名为MyFirstPage。像这样在上面放一个文本块:
<TextBlock Text="The Title of my App" />
3)运行应用程序,并确保显示此文本。
4)创建一个ViewModel类。这是一个基本的类文件。在ViewModels文件夹中创建它,并将其命名为MyFirstViewModel。
5)将Page(View)连接到ViewModel。这是我的代码背后的样子,在大多数情况下,这就是我所拥有的全部。将DataContext设置为 View 模型是设置绑定(bind)的关键。还有许多其他框架可以使这种神奇效果发生,但这就是发生的情况。我认为这是最好的起点。
public class MyFirstPage : Page
{
private MyFirstViewModel _viewModel = new MyFirstViewModel();
public MyFirstPage()
{
this.Initialize???
this.DataContext = _viewModel;
}
6)将标题属性添加到您的 View 模型中,现在只需返回一个硬编码值即可。
public string Title { get { return "The Title of my App (set from View Model)"; } }
7)更新View上的TextBlock以使用绑定(bind)
<TextBlock Text="{Binding Title}" />
8)运行该应用程序以测试其是否有效。
因此,这是将 View 模型连接到 View 并查看绑定(bind)工作的基础。
接下来学习:
双向绑定(bind):如果要在TextBox的UI中设置值,则需要更新绑定(bind),使其看起来像{Binding FirstName,Mode = TwoWay},例如,如果要输入名字。 可观察属性:另一个问题是,当您查看模型逻辑更改绑定(bind)属性的值时,这些值将不会显示在UI上。您会怀疑自己的问题出在哪儿,但确实很简单。需要通知UI以进行更新。您更改了基础值,但用户界面不知道要更新。因此,对于诸如FirstName之类的属性,您将需要在ViewModel上以及在属性 setter 中实现INotifyPropertyChanged,调用OnPropertyChanged(“FirstName”)。有很多示例对此进行了描述。 ObservableCollections :与Observable Properties类似,如果您有在 View 模型中调整过的项目列表,则需要通知 View 列表已更改。这样做的方法是使该属性成为ObservableCollection。同样,有很多例子。我的技巧只是为这些属性实现一个 setter/getter 。您想要在构造函数中创建一次集合,或者在属性的getter中延迟加载。如果您曾经创建过ObservableCollection的新实例,则UI的链接将中断,您将不得不为此调用OnPropertyChanged,如果您仅使用ObservableCollection的单个实例并从中删除了项目,则实际上是没有必要的。稍微玩一下,您会明白我的意思。只是重新阅读一遍。 转换器:现在,我们进入了一个新的水平,但是为了使您的代码不受影响,您将利用转换器和中继命令。最常见的转换器是BooleanToVisibilityConverter。这将有助于基于 View 模型上的 bool 值控制 View 组件的可见性。同样,您将必须对此进行研究。 中继命令:与转换器一样,您需要中继命令来保持代码的清洁。中继命令基本上是单击事件的绑定(bind)。与其在后面的代码中没有click事件处理程序,您将在ViewModel中实现一个Relay Command,例如,一个Button Command将绑定(bind)到View Model上的RelayCommand属性。 一旦研究并熟悉这些项目,您将有一个良好的开端。
在某些情况下,确实很难避免出现背后的代码,但是我发现我已经能够找到大多数问题的解决方案,但是有时它需要创造力。
最后一次评论:
我创建一个严格的干净ViewModel的目的是使我可以在各种尺寸(电话和平板电脑)中重复使用它。这是可能的,但是一旦您陷入更棘手的问题,那就更加困难。但是,这里的关键是要为ViewModel驻留一个单独的Lib项目。我所有的解决方案都有Windows Phone 8.1项目,Windows 8.1(商店)项目和Portable类Lib项目。 ViewModels文件夹与所有其他可共享的代码一起进入Lib项目。为了使一切正常,您可能必须使用控制反转,但这是另一篇文章的主题。
祝好运并玩得开心点,
汤姆