一、MVVM介绍

MVVM是Model-View-ViewModel(模型-视图-视图模型)的缩写形式

 1、View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户。

 2、ViewModel是一个C#类,负责收集需要绑定的数据和命令,聚合Model对象,通过View类的DataContext属性绑定到View,同时也可以处理一些UI逻辑。

 3、Model,就是系统中的对象,可包含属性和行为。

 三者之间的关系:View对应一个ViewModel,ViewModel可以聚合N个Model,ViewModel可以对应多个View

二、MVVM的优势

  三权分立。另外,和面向接口编程的思想有点相同;也和 asp.net mvc 有点像。

三、MVVM简单示例

  1.项目结构

我个人喜欢先写 Model,再写 ViewModel, 最后在 xaml 里面绑定数据

Model: UserInfo

代码:

using System;
using System.Collections.Generic;
using System.Text; namespace WpfMVVMDemo.Model
{
public class UserInfo
{
private String _Name;
private int _Age;
public string Name { get => _Name; set => _Name = value; }
public int Age { get => _Age; set => _Age = value; }
}
}

UserInfo

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using WpfMVVMDemo.Model; namespace WpfMVVMDemo
{
public class UserInfoViewModel : INotifyPropertyChanged
{
private UserInfo userInfo; public UserInfoViewModel()
{
this.userInfo = new UserInfo() { Name = "张三", Age = 18 };
} public String Name
{
get { return this.userInfo.Name; }
set
{
this.userInfo.Name = value;
RaisePropertyChanged("Name");
}
} public int Age
{
get { return this.userInfo.Age; }
set
{
this.userInfo.Age = value;
RaisePropertyChanged("Age");
}
} public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(String propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} protected virtual void SetAndNotifyIfChanged<T>(String propertyName, ref T oldVal, ref T newVal)
{
if (oldVal == null && newVal == null) return;
if (oldVal != null && oldVal.Equals(newVal)) return;
if (newVal != null && newVal.Equals(oldVal)) return;
oldVal = newVal;
RaisePropertyChanged(propertyName);
} }
}

UserInfoViewModel

在 MainWindow.xaml 中 声明一个 ViewModel,就像 asp.net mvc 从后端把数据传给视图一样。

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; namespace WpfMVVMDemo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
UserInfoViewModel viewModel = new UserInfoViewModel();
public MainWindow()
{
InitializeComponent();
this.viewModel = base.DataContext as UserInfoViewModel;
}
}
}

MainWindow.xaml.cs

修改 xaml:

<Window x:Class="WpfMVVMDemo.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:WpfMVVMDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
<local:UserInfoViewModel></local:UserInfoViewModel>
</Window.DataContext>
<Grid>
<TextBox Text="{Binding Name}" HorizontalAlignment="Left" Margin="176,82,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<Label Content="姓名" HorizontalAlignment="Left" Margin="122,78,0,0" VerticalAlignment="Top"/>
<TextBox Text="{Binding Age}" HorizontalAlignment="Left" Margin="176,112,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<Label Content="年龄" HorizontalAlignment="Left" Margin="122,108,0,0" VerticalAlignment="Top"/> </Grid>
</Window>

MainWindow.xaml

Done!

最近在了解工控方面的编程,发现WPF搞工控开发很好。

QQ:77915862

有兴趣的可以一起交流。

最新文章

  1. Android开发常用工具类
  2. 手机端布局rem 与vm的使用
  3. bmp图片的有关操作
  4. BZOJ 4247: 挂饰 题解
  5. html 空格-有趣的试验
  6. HTML5表单新增属性
  7. 浅谈github页面域名绑定
  8. VC2010 MFC文档类菜单快捷键无法加载问题
  9. PHP视频教程 &gt; PHP面向对象编程视频教程
  10. POJ 1185 (状态压缩DP)
  11. nginx日志格式含义
  12. gnu cc扩展和ABI
  13. Jsvc安装,配置 常规用户使用tomcat的80端口
  14. shell入门之expr的使用
  15. PTA第三次作业
  16. js小方法积累,将一个数组按照n个一份,分成若干数组
  17. python之文件处理
  18. Effective Java 第三版——83. 明智谨慎地使用延迟初始化
  19. android 开发 View _2_ View的属性动画ObjectAnimator ,动画效果一览
  20. [UE4]用Blenspace混合空间动画代替AimOffset动画偏移

热门文章

  1. rxswift自定义扩展UI组件
  2. UITextView布局不是从0开始的问题
  3. Oracle重建索引
  4. idea插件Tranlation配置有道搜索引擎
  5. SDIO接口WIFI&amp;BT之相关常备知识
  6. 对LVDS的浅显理解
  7. ReactJS单页面应用之项目搭建
  8. 吴恩达老师机器学习课程chapter04——神经网络
  9. StatefulWidget 有状态组件 、 页面上绑定数据、改变页面数据
  10. Java注解及应用原理