博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写一个WPF-MVVM
阅读量:6158 次
发布时间:2019-06-21

本文共 5796 字,大约阅读时间需要 19 分钟。

  1. 项目的结构,通常情况下项目会创建Command、Models、Services、ViewModels、Views这几个文件夹。文件夹的作用请看名字。  
  2. MainWindow的代码如下:
    1 
    9
    10
    11
    12
    13
    14
    15
    16 17 18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
  3. NotificationObject需要实现接口INotifyPropertyChanged,我理解他的作用是简化属性变更的通知方式。
    1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7  8 namespace WPF_MVVM.ViewModels 9 {10     class NotificationObject : INotifyPropertyChanged11     {12         public event PropertyChangedEventHandler PropertyChanged;13 14         public void RaisePropertyChanged(string propertyName)15         {16             if (this.PropertyChanged!=null)17             {18                 this.PropertyChanged.Invoke(this,new PropertyChangedEventArgs(propertyName));19             }20         }21     }22 }
  4. DelegateCommand需要实现接口ICommand。
    1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows.Input; 7  8 namespace WPF_MVVM.Commands 9 {10     class DelegateCommand : ICommand11     {12         /// 13         /// 这里定义事件可通知绑定命令的元素IsEnabled是True还是False14         /// 15         public event EventHandler CanExecuteChanged16         {17             add { CommandManager.RequerySuggested += value; }18             remove { CommandManager.RequerySuggested -= value; }19         }20 21         public bool CanExecute(object parameter)22         {23             if (this.CanExecuteFunc==null)24             {25                 return true;26             }27 28             return this.CanExecuteFunc(parameter);29         }30         public void Execute(object parameter)31         {32             if (this.ExecuteAction == null)33             {34                 return;35             }36 37             this.ExecuteAction(parameter);38         }39         public Action ExecuteAction { get; set; }40         public Func
    CanExecuteFunc { get; set; }41 }42 }
  5. MainWindowViewModel需要继承于类NotificationObject,通过对属性set的操作中添加this.RaisePropertyChanged("Input1");
    1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Microsoft.Win32; 7 using WPF_MVVM.Commands; 8  9 namespace WPF_MVVM.ViewModels10 {11     class MainWindowViewModel:NotificationObject12     {13         private double input1;14         public double Input115         {16             get { return input1;}17             set18             {19                 input1 = value;20                 this.RaisePropertyChanged("Input1");21             }22         }23 24         private double input2;25         public double Input226         {27             get { return input2; }28             set29             {30                 input2 = value;31                 this.RaisePropertyChanged("Input2");32             }33         }34 35         private double result;36         public double Result37         {38             get { return result; }39             set40             {41                 result = value;42                 this.RaisePropertyChanged("Result");43             }44         }45         public DelegateCommand AddCommand { get; set; }46         public DelegateCommand SaveCommand { get; set; }47         private void Add(object parameter)48         {49             this.Result = this.Input1 + this.Input2;50         }51 52         private bool CanAdd(object parmeter)53         {54             if (this.Input1!=0 && this.Input2!=0)55             {56                 return true;57             }58             else59             {60                 return false;61             }62         }63 64         private void Save(object parameter)65         {66             SaveFileDialog saveFileDialog=new SaveFileDialog();67             saveFileDialog.ShowDialog();68         }69         public MainWindowViewModel()70         {71             this.AddCommand=new DelegateCommand();72             this.AddCommand.ExecuteAction=new Action(this.Add);73             this.AddCommand.CanExecuteFunc=new Func
    (this.CanAdd);74 75 this.SaveCommand=new DelegateCommand();76 this.SaveCommand.ExecuteAction=new Action
    (this.Save);77 }78 }79 }
  6. 如何将MainWindow.xaml与MainWindowViewModel.cs结合呢?
    1. DataContext,先找当前控件的,然后向上查找对于的DataContext。
  7. MainWindow.xaml的后台代码实现MainWindow.xaml与MainWindowViewModel.cs结合
    1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows; 7 using System.Windows.Controls; 8 using System.Windows.Data; 9 using System.Windows.Documents;10 using System.Windows.Input;11 using System.Windows.Media;12 using System.Windows.Media.Imaging;13 using System.Windows.Navigation;14 using System.Windows.Shapes;15 using WPF_MVVM.ViewModels;16 17 namespace WPF_MVVM18 {19     /// 20     /// MainWindow.xaml 的交互逻辑21     /// 22     public partial class MainWindow : Window23     {24         public MainWindow()25         {26             InitializeComponent();27             this.DataContext = new MainWindowViewModel();28         }29     }30 }

     

转载于:https://www.cnblogs.com/bjxingch/articles/9669905.html

你可能感兴趣的文章
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
js中var、let、const的区别
查看>>
简洁优雅地实现夜间模式
查看>>
react学习总结
查看>>
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
Apache通过mod_php5支持PHP
查看>>
java学习:jdbc连接示例
查看>>
Silverlight 如何手动打包xap
查看>>
Javascript一些小细节
查看>>
禁用ViewState
查看>>
Android图片压缩(质量压缩和尺寸压缩)
查看>>
nilfs (a continuent snapshot file system) used with PostgreSQL
查看>>
【SICP练习】150 练习4.6
查看>>