WPF MVVM开发要点、WPF MVVM开发技巧

锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。

WPF MVVM开发要点、WPF MVVM开发技巧



本文来源于TechNet,谢谢原作者。里面有我的翻译和理解,对于初学者和有一定经验的朋友都有提升能力作用,欢迎关注和收藏。


介绍


模型视图 ViewModel是 WPF 的核心要点,允许开发人员将其应用程序代码与任何 UI 依赖项完全分离。
这意味着可以轻松地重新设计应用程序,并且还可以使应用程序更易于测试。 View代表任何前端用户界面控件(Window、Page、UserControl), Model代表应用程序中使用的类,而ViewModel请求、塑造和公开数据(作为属性和命令)的中间人。

关于示例项目

这篇文章链接到一个 TechNet 示例项目,您可以下载和浏览该项目。 它涵盖了 MVVM 的许多基本概念,以及一些常见的陷阱和解决方案。
我们的想法是下载示例,运行它以查看每个示例,然后通读此示例以及代码。当你完成时,你应该知道你需要知道的大部分内容 :)
下载: http://gallery.technet.microsoft.com/Easy-MVVM-Examples-48c94de3
如果你正在寻找更多好的 WPF 示例,您可能会喜欢 我的其他画廊示例项目 。我要问的是你给他们打分(星),谢谢。

注:实际上例子下载不到,想认真学习本文要点的找锐英源交流了。

经典 INotifyPropertyChanged


WPF MVVM开发要点、WPF MVVM开发技巧



第一个示例是经典的 MVVM 配置,在基类 ( ViewModelBase )中实现 INotifyPropertyChanged

class ViewModelBase : INotifyPropertyChanged{ internal void RaisePropertyChanged(string prop) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); } } public event PropertyChangedEventHandler PropertyChanged;
该基类包含所有其他派生 ViewModel 的所有属性使用的公共代码,如下所示。

string _TextProperty1;public string TextProperty1{ get { return _TextProperty1; } set { if (_TextProperty1 != value) { _TextProperty1 = value; RaisePropertyChanged("TextProperty1"); } }}
如您所见,它看起来像一个标准的 CLI 对象,但在 setter 中具有额外的RaisePropertyChanged方法。

在示例 1 中,ViewModel 由 View 本身附加在 XAML 中。请注意,这是可能的,因为 ViewModel 在其构造函数中不需要任何参数。


有一个ListBoxDataGridComboBox , 所有控件的ItemsSource绑定到同一个集合,以及同一个SelectedItem
DataGrid 中任何属性值的更改都会反映在所有控件中。
当您在任何这些控件中更改选定的人时,您将看到所有三个一起更改。
TextBox 和 TextBlock 共享相同的属性,因此 TextBox 中的更改会反映在 TextBlock 中。
单击按钮添加用户,它显示在所有三个控件中。
虽然很多人会认为这都是由于我们“丰富”了 INPC 类,但 实际上大部分是通过通过 UI 更改值来触发的, 后面会解释。
只有 Add user 命令依赖于 PropertyChanged 事件,它们来自不断变化的 ObservableCollection。

在代码隐藏中从事件处理程序切换窗口


从一个窗口导航到另一个窗口的传统方法是使用代码隐藏事件处理程序,这出现在传统的触发函数里。
这意味着您的代码与用户界面紧密耦合。

private void Button_Click(object sender, RoutedEventArgs e){ var win = new Window1 { DataContext = new ViewModelWindow1(tb1.Text) }; win.Show(); this.Close();}


MVVM 中最常见的第一个问题是如何从 ViewModel 调用 Window.Close() 等控件的方法

这将在下一个示例中显示。

注:这个在我写的代码里用到了消息。

用代码制作的 DataContext



第二个示例简单地展示了如何将 ViewModel 从代码附加到 DataContext ,由上面显示的上一个窗口完成,因为这个窗口是创建的。

var win = new Window1 { DataContext = new ViewModelWindow1(tb1.Text) };
在此示例中,ViewModel 在其构造函数中采用了一个字符串参数。构造函数中完成的工作是在绑定发生之前,所以我们可以填充 私有变量

public ViewModelWindow1(string lastText){ _TestText = lastText;
此 ViewModel 派生自 ViewModelMain,具有额外的公共属性和命令,用于从基类中提取值并更新此新属性。Button 命令在CommandParameter

中传入来自 UI 的值。这使我们不必直接从代码中引用控件。