- 浏览: 204372 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (231)
- C++学习 (41)
- vc学习 (25)
- vc异常 (4)
- Flex (2)
- Ext (0)
- java学习笔记 (15)
- mysql学习笔记 (1)
- ibatis学习笔记 (7)
- struts1学习笔记 (1)
- hibernate学习笔记 (3)
- javascript学习笔记 (8)
- eclipse快捷键 (2)
- 英语学习 (1)
- cmd (1)
- eclipse 配置 (2)
- 其他 (4)
- JAVASE (34)
- firefox (1)
- linux (8)
- Apache (6)
- cms (22)
- jsuc (10)
- html (3)
- css (1)
- 作图 (2)
- vs2012 (2)
- 编码转换 (12)
- work_unicode (1)
- work_webbrowser (1)
- work_trade_quotes_login (1)
- c#学习 (38)
- wpf学习 (31)
- wpf快速学习 (1)
- VB学习 (1)
- NSIS (4)
- log4cpp (3)
- 学习web (1)
- 经验 (1)
- c_汇编 (1)
最新评论
WPF经典编程模式-MVVM示例讲解
本篇从两个方面来讨论MVVM模式:
1. MVVM理论知识
2. MVVM示例讲解
一,MVVM理论知识
从上一篇文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。
我们使用模式,一般是想达到高内聚低耦合。在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过数据绑定来更新UI;在响应用户操作上,WinForm是通过控件的事件来处理,而WPF可以使用命令绑定的方式来处理,耦合度将降低。
我们可以通过下图来直观的理解MVVM模式:
User Input
View
View Model
Model
View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户。
ViewModel,一个C#类,负责收集需要绑定的数据和命令,聚合Model对象,通过View类的DataContext属性绑定到View,同时也可以处理一些UI逻辑。
Model,就是系统中的对象,可包含属性和行为。
一般,View对应一个ViewModel,ViewModel可以聚合N个Model,ViewModel可以对应多个View,Model不知道View和ViewModel的存在。
二,MVVM示例讲解
这个示例是为了让大家直观地了解MVVM的编程模式,关于其中用到的数据绑定和命令等知识,在后面的文章会专门讨论。
1. 首先定义NotificationObject类。目的是绑定数据属性。这个类的作用是实现了INotifyPropertyChanged接口。WPF中类要实现这个接口,其属性成员才具备通知UI的能力,数据绑定的知识,后面详细讨论。
using System.ComponentModel;
namespace WpfFirst
{
class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
2.定义DelegateCommand类。目的是绑定命令属性。这个类的作用是实现了ICommand接口,WPF中实现了ICommand接口的类,才能作为命令绑定到UI。命令的知识,后面详细讨论。
using System;
using System.Collections.Generic;
using System.Windows.Input;
namespace WpfFirst
{
class DelegateCommand : ICommand
{
//A method prototype without return value.
public Action<object> ExecuteCommand = null;
//A method prototype return a bool type.
public Func<object, bool> CanExecuteCommand = null;
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
if (CanExecuteCommand != null)
{
return this.CanExecuteCommand(parameter);
}
else
{
return true;
}
}
public void Execute(object parameter)
{
if (this.ExecuteCommand != null) this.ExecuteCommand(parameter);
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
3.开始定义Model类。一个属性成员"WPF",它就是数据属性,的有通知功能,它改变后,会知道通知UI更新。一个方法“Copy”,用来改变属性“WPF”的值,它通过命令的方式相应UI事件。
using System.ComponentModel;
using System.Windows.Input;
namespace WpfFirst
{
class Model : NotificationObject
{
private string _wpf = "WPF";
public string WPF
{
get { return _wpf; }
set
{
_wpf = value;
this.RaisePropertyChanged("WPF");
}
}
public void Copy(object obj)
{
this.WPF += " WPF";
}
}
}
4.定义ViewModel类。定义了一个命令属性"CopyCmd",聚合了一个Model对象"model"。这里的关键是,给CopyCmd命令指定响应命令的方法是model对象的“Copy”方法。
using System;
namespace WpfFirst
{
class ViewModel
{
public DelegateCommand CopyCmd { get; set; }
public Model model { get; set; }
public ViewModel()
{
this.model = new Model();
this.CopyCmd = new DelegateCommand();
this.CopyCmd.ExecuteCommand = new Action<object>(this.model.Copy);
}
}
}
5.定义View.
MainWindow.xaml代码:我们能看到,TextBlock控件的text属性,绑定在model对象的WPF属性上; Button的click事件通过命令绑定到CopyCmd命令属性。
<Window x:Class="WpfFirst.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel VerticalAlignment="Center" >
<TextBlock Text="{Binding model.WPF}" Height="208" TextWrapping="WrapWithOverflow"></TextBlock>
<Button Command="{Binding CopyCmd}" Height="93" Width="232">Copy</Button>
</StackPanel>
</Grid>
</Window>
MainWindow.xaml.cs代码:它的工作知识把ViewModel对象赋值到DataContext属性,指定View的数据源就是这个ViewModel。
using System.Windows;
namespace WpfFirst
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
}
6.运行结果。每当我们点击按钮,界面就是被更新了,因为Copy方法改变了WFP属性的值。
写这个简单的例子,就是为了直观地了解MVVM的编程模式。在实际开发中,不管程序有多复杂,也就是增加Model, View, ViewModel,和其他的一些辅助类(Helpers or Services)了,模式不会改变。
本篇从两个方面来讨论MVVM模式:
1. MVVM理论知识
2. MVVM示例讲解
一,MVVM理论知识
从上一篇文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。
我们使用模式,一般是想达到高内聚低耦合。在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过数据绑定来更新UI;在响应用户操作上,WinForm是通过控件的事件来处理,而WPF可以使用命令绑定的方式来处理,耦合度将降低。
我们可以通过下图来直观的理解MVVM模式:
User Input
View
View Model
Model
View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户。
ViewModel,一个C#类,负责收集需要绑定的数据和命令,聚合Model对象,通过View类的DataContext属性绑定到View,同时也可以处理一些UI逻辑。
Model,就是系统中的对象,可包含属性和行为。
一般,View对应一个ViewModel,ViewModel可以聚合N个Model,ViewModel可以对应多个View,Model不知道View和ViewModel的存在。
二,MVVM示例讲解
这个示例是为了让大家直观地了解MVVM的编程模式,关于其中用到的数据绑定和命令等知识,在后面的文章会专门讨论。
1. 首先定义NotificationObject类。目的是绑定数据属性。这个类的作用是实现了INotifyPropertyChanged接口。WPF中类要实现这个接口,其属性成员才具备通知UI的能力,数据绑定的知识,后面详细讨论。
using System.ComponentModel;
namespace WpfFirst
{
class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
2.定义DelegateCommand类。目的是绑定命令属性。这个类的作用是实现了ICommand接口,WPF中实现了ICommand接口的类,才能作为命令绑定到UI。命令的知识,后面详细讨论。
using System;
using System.Collections.Generic;
using System.Windows.Input;
namespace WpfFirst
{
class DelegateCommand : ICommand
{
//A method prototype without return value.
public Action<object> ExecuteCommand = null;
//A method prototype return a bool type.
public Func<object, bool> CanExecuteCommand = null;
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
if (CanExecuteCommand != null)
{
return this.CanExecuteCommand(parameter);
}
else
{
return true;
}
}
public void Execute(object parameter)
{
if (this.ExecuteCommand != null) this.ExecuteCommand(parameter);
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
3.开始定义Model类。一个属性成员"WPF",它就是数据属性,的有通知功能,它改变后,会知道通知UI更新。一个方法“Copy”,用来改变属性“WPF”的值,它通过命令的方式相应UI事件。
using System.ComponentModel;
using System.Windows.Input;
namespace WpfFirst
{
class Model : NotificationObject
{
private string _wpf = "WPF";
public string WPF
{
get { return _wpf; }
set
{
_wpf = value;
this.RaisePropertyChanged("WPF");
}
}
public void Copy(object obj)
{
this.WPF += " WPF";
}
}
}
4.定义ViewModel类。定义了一个命令属性"CopyCmd",聚合了一个Model对象"model"。这里的关键是,给CopyCmd命令指定响应命令的方法是model对象的“Copy”方法。
using System;
namespace WpfFirst
{
class ViewModel
{
public DelegateCommand CopyCmd { get; set; }
public Model model { get; set; }
public ViewModel()
{
this.model = new Model();
this.CopyCmd = new DelegateCommand();
this.CopyCmd.ExecuteCommand = new Action<object>(this.model.Copy);
}
}
}
5.定义View.
MainWindow.xaml代码:我们能看到,TextBlock控件的text属性,绑定在model对象的WPF属性上; Button的click事件通过命令绑定到CopyCmd命令属性。
<Window x:Class="WpfFirst.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel VerticalAlignment="Center" >
<TextBlock Text="{Binding model.WPF}" Height="208" TextWrapping="WrapWithOverflow"></TextBlock>
<Button Command="{Binding CopyCmd}" Height="93" Width="232">Copy</Button>
</StackPanel>
</Grid>
</Window>
MainWindow.xaml.cs代码:它的工作知识把ViewModel对象赋值到DataContext属性,指定View的数据源就是这个ViewModel。
using System.Windows;
namespace WpfFirst
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
}
6.运行结果。每当我们点击按钮,界面就是被更新了,因为Copy方法改变了WFP属性的值。
写这个简单的例子,就是为了直观地了解MVVM的编程模式。在实际开发中,不管程序有多复杂,也就是增加Model, View, ViewModel,和其他的一些辅助类(Helpers or Services)了,模式不会改变。
发表评论
-
byte数组直接输出
2016-07-19 11:38 1249byte数组直接输出 BitConverter.ToStrin ... -
wfi:WindowsFormsHost焦点设置
2016-07-05 17:56 580<wfi:WindowsFormsHost> ... -
x:Name
2016-04-25 10:44 450由于“Dameer”是在同一程序集中实现的,您必须设置 x:N ... -
WindowsFormsHost的使用注意
2016-04-25 10:24 1347一使用 1 引用 2 xmlns:wfi ="clr ... -
TextBox滚动条
2016-04-22 16:51 657<TextBox Grid.Row="1& ... -
TextBlock滚动条
2016-04-22 16:49 453<ScrollViewer Name="s ... -
C#_WPF_WPF用户控件库
2016-04-12 11:37 798新建项目》window桌面》WPF用户控件库 -
DependencyProperty.UnsetValue_WPF涉及到资源的嵌套引用,被引用的资源要定义在引用的资源前面
2015-10-27 15:09 1992错误 1 “{DependencyProperty.Unset ... -
string格式的日期时间字符串转为DateTime类型
2015-08-05 14:22 963string格式的日期时间字符串转为DateTime类型 / ... -
checkbox
2015-07-28 17:18 554private void Chec ... -
自定义DataGrid样式
2015-06-26 22:03 747<ResourceDictionary xmlns=&q ... -
x:Name x:Key Name区别
2015-06-25 15:40 597x:Name x:Key Name区别 1、x:Key 只 ... -
work_代码添加
2015-06-23 17:15 507<UserControl x:Class=" ... -
FindName和VisualTreeHelper
2015-06-19 13:23 756int iCount = this.dataGridCan ... -
理解WPF中的视觉树和逻辑树(转载)
2015-06-19 13:00 586理解WPF中的视觉树和逻辑树 理解WPF中的 ... -
理解WPF中的视觉树和逻辑树(转载)
2015-06-19 12:58 1681理解WPF中的视觉树和逻 ... -
GetEnumerator
2015-06-19 12:39 651IEnumerator enumerator = this ... -
资源文件获取配置
2015-06-18 16:03 369object obj = Application.Curren ... -
Pack URI
2015-06-18 15:41 685主要用来定位 资源文 ... -
wpf学习之ObservableCollection<T>相关知识
2015-04-23 11:10 3305本篇学习了ObservableCollection<T& ...
相关推荐
在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很...
总结起来,"深入浅出WPF-刘铁猛-MVVM视频源代码"是一个极好的学习资源,通过实例代码和视频讲解,有助于开发者掌握MVVM模式在WPF中的应用,提升开发效率和代码质量。对于想要深入WPF和MVVM的初学者,这套资源是不容...
**WPF编程宝典——使用C#2012和.NET4.5(源码)** Windows Presentation Foundation(WPF)是微软开发的一种用于构建Windows客户端应用程序的技术,它集成了UI设计、数据绑定、多媒体、图形渲染等多个功能,极大地...
在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很...
本书《WPF编程宝典——C# 2010版》显然是面向C# 2010开发者的指南,旨在深入讲解如何利用WPF构建高效、美观的应用程序。源代码的提供对于读者来说是一大福利,因为它允许读者直接查看并运行书中的示例,加深对理论...
这个压缩包包含的是书中的第21章到第30章的源代码示例,旨在帮助读者深入理解和实践WPF编程。以下是各章节涉及的主要知识点: 1. **第21章:数据绑定** 本章详细介绍了WPF中的数据绑定机制,包括一元和双向绑定、...
《WPF编程宝典C#2012 第4版》是针对Windows Presentation Foundation(WPF)技术的一部深入解析的编程指南,旨在帮助开发者掌握使用C#进行WPF应用程序开发的专业技能。这本书的源码提供了书中各章节实例的详细实现,...
**学习路径**:本资料首先可能从基础概念开始,介绍WPF的架构、控件和布局管理,然后深入到数据绑定和MVVM(Model-View-ViewModel)设计模式,接着可能探讨WPF的图形和媒体功能,包括2D/3D图形、图像和动画。...
《WPF编程宝典——使用C# 2012和.NET 4.5(第4版)源码》是一部深入探讨Windows Presentation Foundation (WPF) 技术的专业书籍,结合C# 2012编程语言和.NET Framework 4.5平台,为开发者提供了丰富的实践案例和详细...
**WPF编程(第二版)** Windows Presentation Foundation(WPF),是微软.NET Framework的重要组成部分,为开发者提供了构建桌面应用程序的强大工具和技术。WPF第二版的中文版深入浅出地介绍了这个平台,帮助开发者...
《WPF编程宝典C#2012和.NET4.5(第4版)》是一本深入探讨Windows Presentation Foundation(WPF)技术的专业书籍,它面向的是使用C#语言和.NET Framework 4.5进行桌面应用开发的程序员。源代码是这本书的重要组成部分...
《WPF编程宝典——C# 2010版》是一本专注于Windows Presentation Foundation(WPF)技术的深入教程,结合C# 2010编程语言进行讲解。WPF是微软.NET Framework的一部分,旨在提供一个统一的编程模型,用于构建富客户端...
《WPF编程宝典》是面向C#开发者的一本专业指南,主要涵盖了Windows Presentation Foundation (WPF)这一强大的用户界面框架。WPF是.NET Framework 3.5中的一个核心组件,它提供了丰富的图形渲染能力、数据绑定、以及...
《WPF编程宝典——C#+2010版 书籍配套源码》是一份针对Windows Presentation Foundation(WPF)的编程资源,旨在帮助开发者深入理解并熟练掌握使用C# 2010进行WPF应用开发。WPF是.NET Framework的一部分,提供了丰富...
在本文中,我们将深入探讨如何实现一个基于WPF(Windows Presentation Foundation)的托盘程序,同时结合MVVM(Model-View-...通过分析和修改这个代码,你可以进一步了解WPF编程和MVVM架构,并将其应用到自己的项目中。
3. **WPF_编程宝典.doc**:这可能是一本更深入的指南,涵盖了高级主题,如依赖属性、数据模板、资源字典、控件模板、动画和转换,以及如何利用MVVM(Model-View-ViewModel)设计模式进行开发。这些内容有助于提升...
《WPF编程宝典vs2010版》是一本专注于WPF(Windows Presentation Foundation)技术的编程书籍,专门为使用...读者在学习过程中,应结合Visual Studio 2010环境,实践书中的示例代码,以更好地理解和掌握WPF编程技能。
通过这些示例,你可以了解如何在实际项目中应用WPF,提升你的编程技能。同时,由于代码已分段,下载和学习变得更加便捷,确保了较高的学习效率。 总之,"WPF全视角分析源码 - VS2008 - (1 - 5)" 是一个宝贵的资源,...
3. **数据绑定**:讲解了WPF强大的数据绑定机制,包括单向、双向绑定,以及如何利用MVVM(Model-View-ViewModel)模式来实现数据驱动的应用程序。 4. **样式和模板**:阐述了如何使用样式和模板来自定义控件的外观...