`

WPF经典编程模式-MVVM示例讲解(转载)

 
阅读更多
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)了,模式不会改变。

分享到:
评论

相关推荐

    WPF经典编程模式-MVVM示例讲解

    在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很...

    深入浅出WPF-刘铁猛-MVVM视频源代码,MVVM入门与提高视频对应的源代码

    总结起来,"深入浅出WPF-刘铁猛-MVVM视频源代码"是一个极好的学习资源,通过实例代码和视频讲解,有助于开发者掌握MVVM模式在WPF中的应用,提升开发效率和代码质量。对于想要深入WPF和MVVM的初学者,这套资源是不容...

    WPF编程宝典--使用C#2012和.NET4.5(源码)

    **WPF编程宝典——使用C#2012和.NET4.5(源码)** Windows Presentation Foundation(WPF)是微软开发的一种用于构建Windows客户端应用程序的技术,它集成了UI设计、数据绑定、多媒体、图形渲染等多个功能,极大地...

    WPF MVVM示例讲解

    在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很...

    WPF编程宝典-C# 2010版

    本书《WPF编程宝典——C# 2010版》显然是面向C# 2010开发者的指南,旨在深入讲解如何利用WPF构建高效、美观的应用程序。源代码的提供对于读者来说是一大福利,因为它允许读者直接查看并运行书中的示例,加深对理论...

    Pro-WPF-Chapter21-30.rar_C# EDI

    这个压缩包包含的是书中的第21章到第30章的源代码示例,旨在帮助读者深入理解和实践WPF编程。以下是各章节涉及的主要知识点: 1. **第21章:数据绑定** 本章详细介绍了WPF中的数据绑定机制,包括一元和双向绑定、...

    WPF编程宝典C#2012 第4版 源码

    《WPF编程宝典C#2012 第4版》是针对Windows Presentation Foundation(WPF)技术的一部深入解析的编程指南,旨在帮助开发者掌握使用C#进行WPF应用程序开发的专业技能。这本书的源码提供了书中各章节实例的详细实现,...

    WPF Recipes in C# 2008(WPF学习经典资料)+16个WPF源代码示例程序

    **学习路径**:本资料首先可能从基础概念开始,介绍WPF的架构、控件和布局管理,然后深入到数据绑定和MVVM(Model-View-ViewModel)设计模式,接着可能探讨WPF的图形和媒体功能,包括2D/3D图形、图像和动画。...

    WPF编程宝典——使用C# 2012和.NET 4.5(第4版)源码

    《WPF编程宝典——使用C# 2012和.NET 4.5(第4版)源码》是一部深入探讨Windows Presentation Foundation (WPF) 技术的专业书籍,结合C# 2012编程语言和.NET Framework 4.5平台,为开发者提供了丰富的实践案例和详细...

    WPF编程(第二版)中文版06~08.pdf

    **WPF编程(第二版)** Windows Presentation Foundation(WPF),是微软.NET Framework的重要组成部分,为开发者提供了构建桌面应用程序的强大工具和技术。WPF第二版的中文版深入浅出地介绍了这个平台,帮助开发者...

    WPF编程宝典C#2012和.NET4.5(第4版)源代码

    《WPF编程宝典C#2012和.NET4.5(第4版)》是一本深入探讨Windows Presentation Foundation(WPF)技术的专业书籍,它面向的是使用C#语言和.NET Framework 4.5进行桌面应用开发的程序员。源代码是这本书的重要组成部分...

    WPF编程宝典——C# 2010版(书籍+源代码)

    《WPF编程宝典——C# 2010版》是一本专注于Windows Presentation Foundation(WPF)技术的深入教程,结合C# 2010编程语言进行讲解。WPF是微软.NET Framework的一部分,旨在提供一个统一的编程模型,用于构建富客户端...

    WPF编程宝典(Pro WPF in C# 2008)(中文、英文、源代码)

    《WPF编程宝典》是面向C#开发者的一本专业指南,主要涵盖了Windows Presentation Foundation (WPF)这一强大的用户界面框架。WPF是.NET Framework 3.5中的一个核心组件,它提供了丰富的图形渲染能力、数据绑定、以及...

    WPF编程宝典——C#+2010版 书籍配套源码

    《WPF编程宝典——C#+2010版 书籍配套源码》是一份针对Windows Presentation Foundation(WPF)的编程资源,旨在帮助开发者深入理解并熟练掌握使用C# 2010进行WPF应用开发。WPF是.NET Framework的一部分,提供了丰富...

    【原创】实现wpf托盘程序的示例源码

    在本文中,我们将深入探讨如何实现一个基于WPF(Windows Presentation Foundation)的托盘程序,同时结合MVVM(Model-View-...通过分析和修改这个代码,你可以进一步了解WPF编程和MVVM架构,并将其应用到自己的项目中。

    WPF学习资料

    3. **WPF_编程宝典.doc**:这可能是一本更深入的指南,涵盖了高级主题,如依赖属性、数据模板、资源字典、控件模板、动画和转换,以及如何利用MVVM(Model-View-ViewModel)设计模式进行开发。这些内容有助于提升...

    WPF编程宝典vs2010版

    《WPF编程宝典vs2010版》是一本专注于WPF(Windows Presentation Foundation)技术的编程书籍,专门为使用...读者在学习过程中,应结合Visual Studio 2010环境,实践书中的示例代码,以更好地理解和掌握WPF编程技能。

    WPF全视角分析源码 - VS2008 - (1 - 5)

    通过这些示例,你可以了解如何在实际项目中应用WPF,提升你的编程技能。同时,由于代码已分段,下载和学习变得更加便捷,确保了较高的学习效率。 总之,"WPF全视角分析源码 - VS2008 - (1 - 5)" 是一个宝贵的资源,...

    WPF编程宝典C#2012 第4版

    3. **数据绑定**:讲解了WPF强大的数据绑定机制,包括单向、双向绑定,以及如何利用MVVM(Model-View-ViewModel)模式来实现数据驱动的应用程序。 4. **样式和模板**:阐述了如何使用样式和模板来自定义控件的外观...

Global site tag (gtag.js) - Google Analytics