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

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

 using System;

 using System.ComponentModel;

 using System.Diagnostics;

 using System.Linq.Expressions;

 /***********************作者:黄昏前黎明后**********************************

 *   作者:黄昏前黎明后

 *   CLR版本:4.0.30319.42000

 *   创建时间:2018-04-15 22:09:56

 *   命名空间:Mvvm

 *   唯一标识:b9043d4c-fdd7-4e0f-a324-00f0f09286d0

 *   机器名称:HLPC

 *   联系人邮箱:hl@cn-bi.com

 *

 *   描述说明:

 *

 *   修改历史:

 *

 *

 *****************************************************************/

 namespace Mvvm

 {

     [Serializable]

     public abstract class ObservableObject : INotifyPropertyChanged

     {

         [field: NonSerialized]

         public event PropertyChangedEventHandler PropertyChanged;

         protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)

         {

             var handler = this.PropertyChanged;

             if (handler != null)

             {

                 handler(this, e);

             }

         }

         protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)

         {

             var propertyName = PropertySupport.ExtractPropertyName(propertyExpresssion);

             this.RaisePropertyChanged(propertyName);

         }

         protected void RaisePropertyChanged(String propertyName)

         {

             VerifyPropertyName(propertyName);

             OnPropertyChanged(new PropertyChangedEventArgs(propertyName));

         }

         [Conditional("DEBUG")]

         [DebuggerStepThrough]

         public void VerifyPropertyName(String propertyName)

         {

             if (TypeDescriptor.GetProperties(this)[propertyName] == null)

             {

                 Debug.Fail("无效属性名: " + propertyName);

             }

         }

     }

 }

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

 using Mvvm;

 using System;

 using System.Collections.Generic;

 using System.Collections.ObjectModel;

 using System.Linq;

 using System.Text;

 using System.Windows.Input;

 /****************************************************************

 *   作者:黄昏前黎明后

 *   CLR版本:4.0.30319.42000

 *   创建时间:2018-04-15 22:32:29

 *   命名空间:Example4.ViewModel

 *   唯一标识:d500d890-7083-4f05-a82a-45f27eaa26d9

 *   机器名称:HLPC

 *   联系人邮箱:hl@cn-bi.com

 *

 *   描述说明:

 *

 *   修改历史:

 *

 *

 *****************************************************************/

 namespace Example4

 {

     public class NamesViewModel

     {

         #region 字段

         ObservableCollection<NameViewModel> _names = new ObservableCollection<NameViewModel>();

         #endregion

         #region 属性

         public ObservableCollection<NameViewModel> names

         {

             get { return _names; }

             set { _names = value; }

         }

         #endregion

         public NamesViewModel()

         {

             _names.Add(new NameViewModel() { UserName = "hl", CompanyName = "中软易通" });

             _names.Add(new NameViewModel() { UserName = "lq", CompanyName = "中软" });

             _names.Add(new NameViewModel() { UserName = "tp", CompanyName = "软易通" });

         }

         #region 命令

         void AddNameExecute()

         {

             _names.Add(new NameViewModel { UserName = "黄昏前黎明后", CompanyName = "中软易通科技" });

         }

         bool CanAddNameExecute()

         {

             return true;

         }

         void UpdateNameExecute(NameViewModel name)

         {

             if (name == null) return;

             name.CompanyName= "无";

         }

         bool CanUpdateNameExecute(NameViewModel name)

         {

             return true;

         }

         public ICommand AddName { get { return new RelayCommand(AddNameExecute, CanAddNameExecute); } }

         public ICommand UpdateName { get { return new RelayCommand<NameViewModel>(new Action<NameViewModel>(UpdateNameExecute), new Predicate<NameViewModel>(CanUpdateNameExecute)); } }

         #endregion

     }

 }

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

 <Window x:Class="Example4.MainWindow"

         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

         xmlns:local="clr-namespace:Example4"

         Title="Example4" Height="147.806" Width="407.044" ResizeMode="NoResize">

     <Window.DataContext>

         <!--声明创建一个NamesViewModel的实例-->

         <local:NamesViewModel></local:NamesViewModel>

     </Window.DataContext>

     <StackPanel Orientation="Horizontal">

         <ListView ItemsSource="{Binding names}" Width="" Name="lv">

             <ListView.ItemTemplate>

                 <DataTemplate>

                     <StackPanel Orientation="Horizontal">

                         <Label Content="{Binding UserName}" />

                         <Label Content="{Binding CompanyName}" FontSize="" />

                     </StackPanel>

                 </DataTemplate>

             </ListView.ItemTemplate>

         </ListView>

         <StackPanel>

             <Button Content="新增用户" Height="" Margin="" Command="{Binding AddName}"/>

             <Button Content="更新选中用户" Height="" Margin="" Command="{Binding UpdateName}" CommandParameter="{Binding ElementName=lv,Path=SelectedItem}"/>

         </StackPanel>

     </StackPanel>

 </Window>

本文程序demo下载地址:链接:https://pan.baidu.com/s/12EEoVVVRbI5EiRNusSz1zg 密码:hbwb

结束语:WPF自学入门系列中对WPF的一些基本概念做了一些演示,但是还是有一些缺失,只是希望能对初学者起到一定的帮助。

最后,感谢你能看到最后。从下周开始学习Component One控件使用。

WPF自学入门(十二)WPF MVVM模式提取函数的更多相关文章

  1. WPF自学入门(二)WPF-XAML布局控件

    上一篇介绍了xaml基本知识,我们已经知道了WPF简单的语法.那么接下来,我们要认识一下WPF的布局容器.布局容器可以使控件按照分类显示,我们一起来看看WPF里面可以使用哪些布局容器用来布局. 在WP ...

  2. WPF自学入门(六)WPF带标题的内容控件简单介绍

    在WPF自学入门(二)WPF-XAML布局控件的文章中分别介绍StackPanel,WarpPanel,DockPanel,Grid,Canvas五种布局容器的使用,可以让我们大致了解容器可以使用在什 ...

  3. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍

    WPF自学入门(十一)WPF MVVM模式Command命令   在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...

  4. WPF自学入门(十一)WPF MVVM模式Command命令

    在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了 ...

  5. WPF自学入门(三)WPF路由事件之内置路由事件

    有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得在WPF自学入门(一 ...

  6. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  7. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  8. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  9. 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

随机推荐

  1. shell重温---基础篇(文件包含)

        和其他语言一样,Shell 也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.Shell 文件包含的语法格式如下: . filename # 注意点号(.)和文件名中间 ...

  2. Linux下查看Mysql数据库端口的方法

    mysql 默认的端口是 3306,但是如果在安装的时候,修改了mysql的默认端口的话,可以采用以下方式查看 第一种方法: 直接查看数据库的配置文件 在/etc/mysql/my.cnf(Linux ...

  3. 20145207《Java程序设计》实验四( Android程序设计)实验报告

    <Java 程序设计>实验四( Android程序设计)实验报告 目录 改变 Android开发基础实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.增加了 ...

  4. WPF 自定义ComboBox样式,自定义多选控件

    原文:WPF 自定义ComboBox样式,自定义多选控件 一.ComboBox基本样式 ComboBox有两种状态,可编辑和不可编辑状态.通过设置IsEditable属性可以切换控件状态. 先看基本样 ...

  5. 奇技淫巧之 unordered_map

    哇,虽然我不知道到为什么这个东西比map快(快了一倍),注意unordered_map要在c++11以上的编译环境下才能用,如c++11,GNU G++11 5.1.0,GNU G++14 .

  6. Codeforces 914 C. Travelling Salesman and Special Numbers (数位DP)

    题目链接:Travelling Salesman and Special Numbers 题意: 给出一个二进制数n,每次操作可以将这个数变为其二进制数位上所有1的和(3->2 ; 7-> ...

  7. Codeforces Round #452 (Div. 2)

    第一次打..(太弱(+99积分是几个意思 A 题意:一堆数,只有1和2,问最多凑出多少个3. 分情况即可 #include<cstdio> int main(){ int a=0,b=0, ...

  8. python爬虫之Scrapy框架(CrawlSpider)

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬去进行实现的(Request模块回调) 方法二:基于CrawlSpi ...

  9. 一键将 Python2 代码自动转化为 Python3

    问题 Python2 的代码直接在 Python3 环境运行的话会报错误: 如果大量的代码,无论是批量替换,还是逐行修改都够累的,这活儿表示不能干! 有没有办法一键转换呢? 百度了一下发现网上的方法如 ...

  10. 利用Smith圆图设计匹配网络

    要实现射频最大的功率传输,必须使负载阻抗与源阻抗相匹配(即信号源阻抗与负载阻抗共轭相等),实现匹配的通常做法是在源和负载之间插入一个匹配网络,该网络不仅仅为减少功率损耗而设计,还可减少噪声干扰.提高功 ...