专栏首页小黎子数据分析WPF自学入门(十二)WPF MVVM模式提取函数

WPF自学入门(十二)WPF MVVM模式提取函数

我们平时在写代码时为了不重复写代码,会进行复制代码或者写通用方法。今天我们就来把上传做的函数提取成为通用的方法调用。把上次写的函数提取为两个主要的文件:ObserableObject和RelayCommand。步骤如下:

新建Mvvm项目,将实例三中的文件复制到Mvvm项目中即可。新建ObserableObject类文件,代码如下:

  1 using System;
  2 
  3 using System.ComponentModel;
  4 
  5 using System.Diagnostics;
  6 
  7 using System.Linq.Expressions;
  8 
  9 /***********************作者:黄昏前黎明后**********************************
 10 
 11 *   作者:黄昏前黎明后
 12 
 13 *   CLR版本:4.0.30319.42000
 14 
 15 *   创建时间:2018-04-15 22:09:56
 16 
 17 *   命名空间:Mvvm
 18 
 19 *   唯一标识:b9043d4c-fdd7-4e0f-a324-00f0f09286d0
 20 
 21 *   机器名称:HLPC
 22 
 23 *   联系人邮箱:hl@cn-bi.com
 24 
 25 *
 26 
 27 *   描述说明:
 28 
 29 *
 30 
 31 *   修改历史:
 32 
 33 *
 34 
 35 *
 36 
 37 *****************************************************************/
 38 
 39 namespace Mvvm
 40 
 41 {
 42 
 43     [Serializable]
 44 
 45     public abstract class ObservableObject : INotifyPropertyChanged
 46 
 47     {
 48 
 49         [field: NonSerialized]
 50 
 51         public event PropertyChangedEventHandler PropertyChanged;
 52 
 53  
 54 
 55         protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
 56 
 57         {
 58 
 59             var handler = this.PropertyChanged;
 60 
 61             if (handler != null)
 62 
 63             {
 64 
 65                 handler(this, e);
 66 
 67             }
 68 
 69         }
 70 
 71  
 72 
 73         protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
 74 
 75         {
 76 
 77             var propertyName = PropertySupport.ExtractPropertyName(propertyExpresssion);
 78 
 79             this.RaisePropertyChanged(propertyName);
 80 
 81         }
 82 
 83  
 84 
 85         protected void RaisePropertyChanged(String propertyName)
 86 
 87         {
 88 
 89             VerifyPropertyName(propertyName);
 90 
 91             OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
 92 
 93         }
 94 
 95  
 96 
 97         [Conditional("DEBUG")]
 98 
 99         [DebuggerStepThrough]
100 
101         public void VerifyPropertyName(String propertyName)
102 
103         {
104 
105             if (TypeDescriptor.GetProperties(this)[propertyName] == null)
106 
107             {
108 
109                 Debug.Fail("无效属性名: " + propertyName);
110 
111             }
112 
113         }
114 
115     }
116 
117 }

前面我们都是使用单个的用户名,接下来我们尝试使用多个用户名。按照我们一开始所说的,我们需要一个ObservableCollection的集合。所以我们需要新增一个ViewModel名称NamesViewModel:

  1 using Mvvm;
  2 
  3 using System;
  4 
  5 using System.Collections.Generic;
  6 
  7 using System.Collections.ObjectModel;
  8 
  9 using System.Linq;
 10 
 11 using System.Text;
 12 
 13 using System.Windows.Input;
 14 
 15  
 16 
 17 /****************************************************************
 18 
 19 *   作者:黄昏前黎明后
 20 
 21 *   CLR版本:4.0.30319.42000
 22 
 23 *   创建时间:2018-04-15 22:32:29
 24 
 25 *   命名空间:Example4.ViewModel
 26 
 27 *   唯一标识:d500d890-7083-4f05-a82a-45f27eaa26d9
 28 
 29 *   机器名称:HLPC
 30 
 31 *   联系人邮箱:hl@cn-bi.com
 32 
 33 *
 34 
 35 *   描述说明:
 36 
 37 *
 38 
 39 *   修改历史:
 40 
 41 *
 42 
 43 *
 44 
 45 *****************************************************************/
 46 
 47 namespace Example4
 48 
 49 {
 50 
 51     public class NamesViewModel
 52 
 53     {
 54 
 55         #region 字段
 56 
 57         ObservableCollection<NameViewModel> _names = new ObservableCollection<NameViewModel>();
 58 
 59         #endregion
 60 
 61  
 62 
 63         #region 属性
 64 
 65         public ObservableCollection<NameViewModel> names
 66 
 67         {
 68 
 69             get { return _names; }
 70 
 71             set { _names = value; }
 72 
 73         }
 74 
 75         #endregion
 76 
 77  
 78 
 79         public NamesViewModel()
 80 
 81         {
 82 
 83             _names.Add(new NameViewModel() { UserName = "hl", CompanyName = "中软易通" });
 84 
 85             _names.Add(new NameViewModel() { UserName = "lq", CompanyName = "中软" });
 86 
 87             _names.Add(new NameViewModel() { UserName = "tp", CompanyName = "软易通" });
 88 
 89         }
 90 
 91  
 92 
 93         #region 命令
 94 
 95  
 96 
 97         void AddNameExecute()
 98 
 99         {
100 
101             _names.Add(new NameViewModel { UserName = "黄昏前黎明后", CompanyName = "中软易通科技" });
102 
103         }
104 
105  
106 
107         bool CanAddNameExecute()
108 
109         {
110 
111             return true;
112 
113         }
114 
115  
116 
117         void UpdateNameExecute(NameViewModel name)
118 
119         {
120 
121             if (name == null) return;
122 
123  
124 
125             name.CompanyName= "无";
126 
127         }
128 
129  
130 
131         bool CanUpdateNameExecute(NameViewModel name)
132 
133         {
134 
135             return true;
136 
137         }
138 
139  
140 
141         public ICommand AddName { get { return new RelayCommand(AddNameExecute, CanAddNameExecute); } }
142 
143  
144 
145         public ICommand UpdateName { get { return new RelayCommand<NameViewModel>(new Action<NameViewModel>(UpdateNameExecute), new Predicate<NameViewModel>(CanUpdateNameExecute)); } }
146 
147  
148 
149         #endregion
150 
151     }
152 
153 }
154 
155  

我们实现了两个命令,一个是新增用户,一个是把所有集合里的公司名更改为无。然后我们把这个ViewModel绑定到界面上:

 1 <Window x:Class="Example4.MainWindow"
 2 
 3         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 4 
 5         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 6 
 7         xmlns:local="clr-namespace:Example4"
 8 
 9         Title="Example4" Height="147.806" Width="407.044" ResizeMode="NoResize">
10 
11     <Window.DataContext>
12 
13         <!--声明创建一个NamesViewModel的实例-->
14 
15         <local:NamesViewModel></local:NamesViewModel>
16 
17     </Window.DataContext>
18 
19  
20 
21     <StackPanel Orientation="Horizontal">
22 
23         <ListView ItemsSource="{Binding names}" Width="200" Name="lv">
24 
25             <ListView.ItemTemplate>
26 
27                 <DataTemplate>
28 
29                     <StackPanel Orientation="Horizontal">
30 
31                         <Label Content="{Binding UserName}" />
32 
33                         <Label Content="{Binding CompanyName}" FontSize="10" />
34 
35                     </StackPanel>
36 
37                 </DataTemplate>
38 
39             </ListView.ItemTemplate>
40 
41         </ListView>
42 
43         <StackPanel>
44 
45             <Button Content="新增用户" Height="40" Margin="20" Command="{Binding AddName}"/>
46 
47             <Button Content="更新选中用户" Height="40" Margin="20" Command="{Binding UpdateName}" CommandParameter="{Binding ElementName=lv,Path=SelectedItem}"/>
48 
49         </StackPanel>
50 
51  
52 
53     </StackPanel>
54 
55 </Window>
56 
57  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WPF自学入门(四)WPF路由事件之自定义路由事件

    在上一篇博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件。接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建...

    黄昏前黎明后
  • C1WPF制作OLAP Cube浏览工具

    经过前期一段时间对WPF的学习了解,相信大家对WPF有了一定的了解。今天我们一起来了解使用Component One(简称C1)的WPF控件制作C...

    黄昏前黎明后
  • SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App.config

    在上一篇文章中,我们已经了解到了如何在SuperSocket处理客户端请求。 同时我们可能会发现一个问题,如果我们的服务器端包含有很多复杂的业务逻辑...

    黄昏前黎明后
  • C#学习系列文章之Windows窗体应用程序003

    紧接着上一篇文章,我已经学习了控制台的使用,以及创建不同应用的Helloworld程序,这一篇文章,我介绍Windows窗体应用程序的简单实用,按照调用流程一步...

    算法发
  • 深度学习中的注意力机制

    用户1737318
  • 用Java打印中文字符的GBK,UTF8和UTF16编码

    Jerry Wang
  • Java中String、StringBuffer、StringBuilder的区别

    Java中String、StringBuffer、StringBuilder的区别 1.从是否可变的角度   String类中使用字符数组保存字符串,因为有“f...

    nnngu
  • .NET自带IOC容器MEF之初体验

    本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuild...

    写代码的猿
  • 快被数据淹没了!然而你还是需要这个---Google Analytics:生命周期价值新功能介绍

    为什么你可能还需要另一个指标?为了把它分析出来,在已经足够长的工作时间中再增加一个小时的工作量,又有什么好处呢?

    iCDO互联网数据官
  • 学linux,全靠这些了

    使用 date 修改 Linux 上的系统时间 date 命令不光能显示时间,还能修改系统上的时间。

    DataScience

扫码关注云+社区

领取腾讯云代金券