【概要】
这一章主要讲述,讲述MVVM模式和用法。
如有学习过程中想交流学习、疑惑解答可以来此QQ群交流:580749909。(所有涉及到的源码都上传到了群文件里)
希望加群的人提问时尽量想清楚自己的问题,愿意钻研而不是等现成的答案而不去思考。祝各位同仁早日学会WPF这项技术。
【MVVM】
前言:MVVM的核心思想就是界面与代码分离,实现“解耦”。是一种开发模式,并不是一种开发框架。主要是以数据驱动的开发模式。
先从项目应用的角度来介绍一下MVVM是什么、怎么用、项目中该怎么建项目结构。
话不多说直接上图:
![ea359e018924624ad8820363c3ddafc7.png](https://i-blog.csdnimg.cn/blog_migrate/711beffe2c2aef3ae3cf161917495d38.png)
图中的结构一眼就能看明白如何建项了,但是实际开发中它们之间的关系又是如何呢,如何使用起来呢。
【关系】
![dfaac6937398d96e187ed344a40a6d38.png](https://i-blog.csdnimg.cn/blog_migrate/9570e640343719aafdcbca52d067023f.png)
View:
拿到需求的第一件事就是会知道界面要做成什么样子,那么第一个创建的就是View。
ViewModel:
主要用来实现业务逻辑的地方,比如需要计算 1 + 1的结果显示到View上。
Model:
这一层主要是用来存放,ViewModel种需要用到的实体类。比如ViewModel业务处理逻辑需要用到的自定义类都可以放到这一层。
【调用】
View:
<Window
x:Class="TestX.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:local="clr-namespace:TestX"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="800"
Height="800"
Opacity="1"
mc:Ignorable="d">
<Grid>
<ListBox ItemsSource="{Binding NameCollection}"></ListBox>
</Grid>
</Window>
View-Code:
DataContext 一般是用来放view model的,因为你要绑定或操作的对象都在view model里。当然也能存放其它类型的对象。
namespace TestX
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainViewModel();
}
}
}
ViewModel:
using GalaSoft.MvvmLight;
using System.Collections.ObjectModel;
using TestX.Models;
namespace TestX.ViewModels
{
public class MainViewModel : ViewModelBase
{
private ObservableCollection<MainModel> _nameCollection;
public ObservableCollection<MainModel> NameCollection
{
get
{
return _nameCollection;
}
set
{
_nameCollection = value;
}
}
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
Do();
}
private void Do() {
NameCollection = new ObservableCollection<MainModel>();
NameCollection.Add(new MainModel() { Name = "张三" });
NameCollection.Add(new MainModel() { Name = "李四" });
NameCollection.Add(new MainModel() { Name = "王五" });
}
}
}
Model:
public class MainModel
{
public string Name { get; set; }
public override string ToString()
{
return Name;
}
}
最终效果:
![9d35ae7eb0d14d1826bf6036ec5422b8.png](https://i-blog.csdnimg.cn/blog_migrate/a6042084f53e6704009797e67191eafb.png)