WPF Demo15 MVVM

项目结构如下:

<Window x:Class="MVVMDemo.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>
        <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" />
        <Label Content="Email" Height="28" HorizontalAlignment="Left" Margin="50,138,0,0" Name="labelStudentEmail" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentEmail}" IsReadOnly="True" Height="23" HorizontalAlignment="Left" Margin="94,141,0,0" Name="textBoxStudentEmail" VerticalAlignment="Top" Width="120" />
        <Label Content="性别" Height="28" HorizontalAlignment="Left" Margin="57,176,0,0" Name="labelStudentSex" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentSex}" IsReadOnly="True" Height="23" HorizontalAlignment="Left" Margin="94,180,0,0" Name="textBoxStudentSex" VerticalAlignment="Top" Width="120" />
        <Button Command="{Binding ShowCommand}" Content="显示" Height="23"  Margin="266,28,162,260" Name="buttonShow"  Width="75" />
        <Button Command="{Binding ResetCommand}" Content="重置" Height="23" HorizontalAlignment="Left" Margin="266,83,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
    </Grid>
</Window>
<!--
MVVM,可以很好的配合WPF的数据绑定机制来实现UI与逻辑代码的分离,
MVVM中的View表示界面,负责页面显示,ViewModel负责逻辑处理,包括
准备绑定的数据和命令,ViewModel通过View的DataContext属性绑定至View,
Model为业务模型,供ViewModel使用
-->

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

namespace MVVMDemo.Model
{
    public class StudentModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        /// <summary>  
        /// 学号  
        /// </summary>  
        private int studentId;
        public int StudentId
        {
            get { return studentId; }
            set
            {
                studentId = value;
                OnPropertyChanged("StudentId");
            }
        }

        /// <summary>  
        /// 姓名  
        /// </summary>  
        private string studentName;
        public string StudentName
        {
            get { return studentName; }
            set
            {
                studentName = value;
                OnPropertyChanged("StudentName");
            }
        }

        /// <summary>  
        /// 年龄  
        /// </summary>  
        private int studentAge;
        public int StudentAge
        {
            get { return studentAge; }
            set
            {
                studentAge = value;
                OnPropertyChanged("StudentAge");
            }
        }

        /// <summary>  
        /// Email  
        /// </summary>  
        private string studentEmail;
        public string StudentEmail
        {
            get { return studentEmail; }
            set
            {
                studentEmail = value;
                OnPropertyChanged("StudentEmail");
            }
        }

        /// <summary>  
        /// 性别  
        /// </summary>  
        private string studentSex;
        public string StudentSex
        {
            get { return studentSex; }
            set
            {
                studentSex = value;
                OnPropertyChanged("StudentSex");
            }
        }
    }
}


using System;
using System.Windows.Input;

namespace MVVMDemo.Helper
{
    public class DelegateCommandHelper : 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);
            }
                return true;
        }

        public void Execute(object parameter)
        {
            if (this.ExecuteCommand != null) this.ExecuteCommand(parameter);
        }

        public void RaiseCanExecuteChanged()
        {
            if (CanExecuteChanged != null) CanExecuteChanged(this, EventArgs.Empty);
        }
    }
}

using System;
using MVVMDemo.Helper;
using MVVMDemo.Model;

namespace MVVMDemo.ViewModel
{
    public class StudentViewModel
    {
        //显示信息
        public DelegateCommandHelper ShowCommand { get; set; }
        //重置信息
        public DelegateCommandHelper ResetCommand { get; set; }

        public StudentModel Student { get; set; }

        public StudentViewModel()
        {
            Student = new StudentModel();
            ShowCommand = new DelegateCommandHelper();
            ResetCommand = new DelegateCommandHelper();
            ShowCommand.ExecuteCommand = new Action<object>(ShowStudentData);
            ResetCommand.ExecuteCommand = new Action<object>(ResetStudentData);
        }

        /// <summary>
        /// 显示内容
        /// </summary>
        /// <param name="obj"></param>
        private void ShowStudentData(object obj)
        {
            Student.StudentId = 1;
            Student.StudentName = "令狐冲";
            Student.StudentAge = 18;
            Student.StudentEmail = "linghuchong@163.com";
            Student.StudentSex = "大帅哥";
        }

        /// <summary>
        /// 重置内容
        /// </summary>
        /// <param name="obj"></param>
        private void ResetStudentData(object obj)
        {
            Student.StudentId = 0;
            Student.StudentName ="重置";
            Student.StudentAge = 0;
            Student.StudentEmail = "重置";
            Student.StudentSex = "重置";
        }
    }
}

using System.Windows;
using MVVMDemo.ViewModel;

namespace MVVMDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new StudentViewModel();  
        }
    }
}

方式二:

目录结构如下:

using Microsoft.Practices.Prism.ViewModel;

namespace MVVM_PrismDemo2.Models
{
    public class StudentModel : NotificationObject
    {
        private string studentId;
        public string StudentId
        {
            get { return studentId; }
            set
            {
                studentId = value;
                RaisePropertyChanged("StudentId");
            }
        }

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

        private string studentAge;
        public string StudentAge
        {
            get { return studentAge; }
            set
            {
                studentAge = value;
                RaisePropertyChanged("StudentAge");
            }
        }

        private string studentEmail;
        public string StudentEmail
        {
            get { return studentEmail; }
            set
            {
                studentEmail = value;
                RaisePropertyChanged("StudentEmail");
            }
        }

        private string studentSex;
        public string StudentSex
        {
            get { return studentSex; }
            set
            {
                studentSex = value;
                RaisePropertyChanged("StudentSex");
            }
        }
    }
}

using System;
using Microsoft.Practices.Prism.Commands;
using Microsoft.Practices.Prism.ViewModel;
using MVVM_PrismDemo2.Models;

namespace MVVM_PrismDemo2.ViewModels
{
    class StudentViewModel :NotificationObject
    {
        /// <summary>
        /// 定义命令属性
        /// </summary>
        public DelegateCommand DisplayDataCommand { get; set; }
        public DelegateCommand ResetDataCommand { get; set; }
        
        private StudentModel student;
        public StudentModel Student
        {
            get { return student; }
            set
            {
                student = value;
            }
        }

        public StudentViewModel()
        {
            Student = new StudentModel();

            DisplayData();

            //初始化命令属性
            DisplayDataCommand = new DelegateCommand(new Action(DisplayData));
            ResetDataCommand = new DelegateCommand(new Action(ResetData));
        }

        private void DisplayData()
        {
            Student.StudentId = "1";
            Student.StudentName = "令狐冲";
            Student.StudentAge = "18";
            Student.StudentEmail = "linghuchong@163.com";
            Student.StudentSex = "大帅哥";
        }

        private void ResetData()
        {
            Student.StudentId = "0";
            Student.StudentName = "重置";
            Student.StudentAge = "0";
            Student.StudentEmail = "重置";
            Student.StudentSex = "重置";
        }
    }
}
<Window x:Class="MVVM_PrismDemo2.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>
        <Label Content="学号" Height="28" HorizontalAlignment="Left" Margin="54,23,0,0" Name="labelStudentId" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentId, Mode=TwoWay}" 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, Mode=TwoWay}" 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, Mode=TwoWay}" IsReadOnly="True" Height="23" HorizontalAlignment="Left" Margin="94,99,0,0" Name="textBoxStudentAge" VerticalAlignment="Top" Width="120" />
        <Label Content="Email" Height="28" HorizontalAlignment="Left" Margin="50,138,0,0" Name="labelStudentEmail" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentEmail, Mode=TwoWay}" IsReadOnly="True" Height="23" HorizontalAlignment="Left" Margin="94,141,0,0" Name="textBoxStudentEmail" VerticalAlignment="Top" Width="120" />
        <Label Content="性别" Height="28" HorizontalAlignment="Left" Margin="57,176,0,0" Name="labelStudentSex" VerticalAlignment="Top" />
        <TextBox Text="{Binding Student.StudentSex, Mode=TwoWay}" IsReadOnly="True" Height="23" HorizontalAlignment="Left" Margin="94,180,0,0" Name="textBoxStudentSex" VerticalAlignment="Top" Width="120" />
        <Button Command="{Binding DisplayDataCommand}"  Content="显示" Height="23"  Margin="266,28,162,260" Name="buttonShow"  Width="75" />
        <Button Command="{Binding ResetDataCommand}" Content="重置" Height="23" HorizontalAlignment="Left" Margin="266,83,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
    </Grid>
</Window>
using System.Windows;
using MVVM_PrismDemo2.ViewModels;

namespace MVVM_PrismDemo2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new StudentViewModel();  
        }
    }
}

原文地址:https://www.cnblogs.com/YYkun/p/6872269.html