在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识:

WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI。

  我们使用模式,一般是想达到高内聚低耦合。在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过数据绑定来更新UI;在响应用户操作上,WinForm是通过控件的事件来处理,而WPF可以使用命令绑定的方式来处理,耦合度将降低。

首先MVVM设计模式的结构

Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联;
ViewModels:由一组命令,可以绑定的属性,操作逻辑构成;因为View与ViewModel进行了解耦,我们可以对ViewModel进行Unit Test;

Models:可以是实体对象或者Web服务;
下面通过一个简单的例子,来介绍一些WPF MVVM模式。首先项目结构:

DelegateCommand.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfApp13.Commands;namespace WpfApp13.ViewModels
{class MainWindowViewModel:NotificationObject{private double  input1;public double Input1{get { return input1; }set{input1 = value;this.RaisePropertyChange("Input1");}}private double input2;public double Input2{get { return input2; }set{input2 = value;this.RaisePropertyChange("Input2");}}private double result;public double Result{get { return result; }set{result = value;this.RaisePropertyChange("Result");}}public DelegateCommand AddCommand { get; set; }public void Add(object parameter){this.Result = this.Input1 + this.Input2;}public MainWindowViewModel(){this.AddCommand = new DelegateCommand();this.AddCommand.ExcuteAction = new Action<object>(this.Add);}}
}

MainWindowViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfApp13.Commands;namespace WpfApp13.ViewModels
{class MainWindowViewModel:NotificationObject{private double  input1;public double Input1{get { return input1; }set{input1 = value;this.RaisePropertyChange("Input1");}}private double input2;public double Input2{get { return input2; }set{input2 = value;this.RaisePropertyChange("Input2");}}private double result;public double Result{get { return result; }set{result = value;this.RaisePropertyChange("Result");}}public DelegateCommand AddCommand { get; set; }public void Add(object parameter){this.Result = this.Input1 + this.Input2;}public MainWindowViewModel(){this.AddCommand = new DelegateCommand();this.AddCommand.ExcuteAction = new Action<object>(this.Add);}}
}

NotificationObject.CS

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WpfApp13.ViewModels
{class NotificationObject : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;public void RaisePropertyChange(string propertyName){if(this.PropertyChanged!=null){this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));}}}
}

MainWindow.xaml.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApp13.ViewModels;namespace WpfApp13
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();this.DataContext = new MainWindowViewModel();}}}

MainWindow.xaml

<Window x:Class="WpfApp13.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp13"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><StackPanel><Slider Name="slider1" MinHeight="25" Value="{Binding Input1}"/><Slider Name="slider2" MinHeight="25" Value="{Binding Input2}"/><Slider Name="slider3" MinHeight="25" Value="{Binding Result}"/><Button Name="addButton" Content="ADD" FontSize="30" MinHeight="40" Command="{Binding AddCommand}"/></StackPanel>     </Grid>
</Window>

运行效果:

分别拖动滑块slider1和slider2,点击按钮后slider3就会自动变化

百度网盘源码下载地址:

链接:https://pan.baidu.com/s/1AvBncokY8SiW0fd9XqrPRw

提取码:ttpo

技术群: 需要进技术群学习交流的请添加小编微信,切记备注:加群,对以上内容有什么疑问也可以直接和小编直接沟通交流!

小编微信:mm1552923

公众号:dotNet编程大全

WPF MVVM实例三相关推荐

  1. wpf mvvm 实例

    1.程序结构如图所示: 2.Model实现 在Model文件夹下新建业务类StudentModel,代码如下: public class StudentModel : INotifyPropertyC ...

  2. 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator?

    从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 从PRISM开始学 ...

  3. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍...

    WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正 ...

  4. C# WPF MVVM项目实战(进阶②)

    这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发,今天主要是增加了一个用户窗体ImageProcessView,然后通过Treeview切换选择项之后在界面显示不同效果的图片 ...

  5. .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器  在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...

  6. c#事件的发布-订阅模型_NET Core 3 WPF MVVM框架 Prism系列之事件聚合器

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器#  在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...

  7. C# WPF MVVM模式Prism框架下事件发布与订阅

    01 - 前言 处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事 ...

  8. C# WPF MVVM模式Prism框架从零搭建(经典)

    01 - 前言 目前最新的PRISM的版本是8.1.97,本节以6.3.0.0 讲解,可以在Github上获取PRISM的源码. Prism Github地址:https://github.com/P ...

  9. WPF MVVM 弹框之等待框

    WPF MVVM 弹框之等待框 目录 一.效果 二.弹框主体改造 三.等待动画用户控件 四.弹窗 ViewModel 和帮助类的改造 五.使用方法和代码地址 独立观察员 2020年10月13日 之前写 ...

最新文章

  1. ISME:宏基因组探究美洲河狸粪便微生物
  2. hibernate继承关系映射方法(一)--共享一张表
  3. unbuntu server (linux系统)下面安装 lamp
  4. 计算机网络之网络层:10、IP组播、IGMP协议、组播路由选择协议
  5. 合并的bean定义 - MergedBeanDefinition
  6. 结队编程1-四则运算(107、120)
  7. python 爬虫(一) requests+BeautifulSoup 爬取简单网页代码示例
  8. 心情随笔——软工实践中获小黄衫有感
  9. 新版FMEA软件参数图(P图)简介(FMEAHunter)
  10. 【唯美日出win7热门主题】
  11. 不足200行代码,我用python写了一个上课点名系统。还没开学的你们慌了吗?
  12. 商迪3D三维虚拟现实VR景区全景漫游展示
  13. 阴阳师服务器维护3月14,3月14日阴阳师体验服更新:三个限定新式神
  14. Qt之自定义QLineEdit
  15. 把北斗七星与北极星捡起来
  16. unity helios_用于Eclipse Helios的JBoss工具!
  17. 求一款快捷回复工具聊天辅助软件手机版(聊天微快聊回复助手)
  18. GPIO与IOMUX
  19. MATLAB函数判断绝对素数,自定义函数,找出 以内所有素数(质数)并计算它们的和,matlab...
  20. linux自定义开机启动脚本

热门文章

  1. 1.8-zabbix服务端安装
  2. AndroidService 深度分析(2)
  3. Mysql日期和时间函数
  4. 1.5.2 在IIS上配置ASP.NET(转)
  5. 【转载】 quartus中调用modelsim仿真的方法
  6. 通过 Lotus Domino Java 代理消费 Web 服务
  7. OSI模型数据链路层为什么需要分层?
  8. 彻底解决.net中编码问题的心得
  9. MSSqlServer基础学习01
  10. AppleScript