MVVM入门

本文介绍了MVVM模式的入门知识,通过一个简单的例子展示了如何在WPF中使用MVVM,包括定义Model,利用ICommand实现命令绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介

MVVM 就是 Model – View – ViewModel 三组功能(类)分割的设计模式。WPF中使用MVVM可以降低UI显示与后端逻辑代码的耦合度,即更换界面时,只需要修改很少的逻辑代码就可以实现,甚至不用修改。在WPF中使用数据绑定机制,当数据变化后,数据会通知界面变更的发生,而不需要通过访问界面元素来修改值,这样在后端逻辑代码中也就不必操作或者很少操作界面的元素了。
使用MVVM,可以很好的配合WPF的数据绑定机制来实现UI与逻辑代码的分离,MVVM中的View表示界面,负责页面显示,ViewModel负责逻辑处理,包括准备绑定的数据和命令,ViewModel通过View的DataContext属性绑定至View,Model为业务模型,供ViewModel使用。

2.例子

废话不多说,直接看例子:
1. 需求:显示学生的学号、姓名和年龄
2. 建立Model:

public class StudentModel : INotifyPropertyChanged {
		
		private string studentId;
		public string StudentId {
			get {
				return studentId;
			}
			set {
				studentId = value;
				NotifyPropertyChanged("StudentId");
			}
		}

		
		private string studentName;
		public string StudentName {
			get {
				return studentName;
			}
			set {
				studentName = value;
				NotifyPropertyChanged("StudentName");
			}
		}

		
		private int studentAge;
		public int StudentAge {
			get {
				return studentAge;
			}
			set {
				studentAge = value;
				NotifyPropertyChanged("StudentAge");
			}
		}

		public event PropertyChangedEventHandler PropertyChanged;
		public void NotifyPropertyChanged(string propertyName) {
			if (PropertyChanged != null) {
				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
			}
		}
}  
3.建立ViewModel:
class StudentViewModel {
		public DelegateCommand ShowCommand { get; set; }
		public StudentModel Student { get; set; }
		public StudentViewModel() {
			Student = new StudentModel();
			ShowCommand = new DelegateCommand();
			ShowCommand.ExecuteCommand = new Action<object>(ShowStudentData);
		}
		private void ShowStudentData(object obj) {
			Student.StudentId = "13818783181";
			Student.StudentName = "xiao";
			Student.StudentAge = 27;
		} 
	}

public class DelegateCommand : ICommand {
		public Action<object> ExecuteCommand = null;
		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);
			}
		}
}
4.绑定数据到View:

<Grid>
        <Label Content="学号" Height="28" HorizontalAlignment="Left" Margin="54,23,0,0" Name="labelStudentId" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentId}" IsReadOnly="True" Height="23" HorizontalAlignment="Right" Margin="0,27,289,0" Name="textBoxStudentId" VerticalAlignment="Top" Width="120" />
        <Label Content="姓名" Height="28" HorizontalAlignment="Left" Margin="54,61,0,0" Name="labelStudentName" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentName}" IsReadOnly="True" Height="23" HorizontalAlignment="Left" Margin="94,65,0,0" Name="textBoxStudentName" VerticalAlignment="Top" Width="120" />
       <Label Content="年龄" Height="28" HorizontalAlignment="Left" Margin="54,94,0,0" Name="labelStudentAge" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentAge}" IsReadOnly="True" Height="23" HorizontalAlignment="Left" Margin="94,99,0,0" Name="textBoxStudentAge" VerticalAlignment="Top" Width="120" />
        <Button Command="{Binding ShowCommand}" Content="显示" Height="23" HorizontalAlignment="Left" Margin="345,27,0,0" Name="buttonShow" VerticalAlignment="Top" Width="75" />
</Grid>
5.将ViewModel设置到DataContext:

public MainWindow() {
	InitializeComponent();
	this.DataContext = new StudentViewModel();  
}
6.说明:

ICommand接口中的Execute()方法用于命令的执行,CanExecute()方法用于指示当前命令在目标元素上是否可用,当这种可用性发生改变时便会触发接口中的CanExecuteChanged事件。
我们可以将实现了ICommand接口的命令DelegateCommand赋值给Button(命令源)的Command属性(只有实现了ICommandSource接口的元素才拥有该属性),这样Button便与命令进行了绑定。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值