在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类。此篇主要介绍DelegateCommand来解决上面所遇到的问题。

首先,我们创建自己的DelegateCommand。

代码如下:

 /// <summary>
/// 实现DelegateCommand
/// </summary>
class MyDelegateCommand : ICommand
{
/// <summary>
/// 命令所需执行的事件
/// </summary>
public Action<object> ExecuteCommand { get; set; }
/// <summary>
/// 命令是否可用所执行的事件
/// </summary>
public Func<object, bool> CanExecuteCommand { get; set; } public MyDelegateCommand()
{
} public MyDelegateCommand(Action<object> execute, Func<object, bool> canexecute)
{
ExecuteCommand = execute;
CanExecuteCommand = canexecute;
} /// <summary>
/// 命令可用性获取
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public bool CanExecute(object parameter)
{
return CanExecuteCommand(parameter);
} public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
} /// <summary>
/// 命令具体执行
/// </summary>
/// <param name="parameter"></param>
public void Execute(object parameter)
{
ExecuteCommand(parameter);
}
}

 

其中的重点是利用两个委托,将方法的实现分离出去,接下来看我们的ViewModel:

  class TestViewModel : INotifyPropertyChanged
{ private string teststr;
/// <summary>
/// 待通知字符串
/// </summary>
public string TestStr
{
get { return teststr; }
set
{
teststr = value;
RaiseChanged("TestStr");
}
} /// <summary>
/// 测试命令
/// </summary>
public ICommand TestCommand { get; set; } public TestViewModel()
{
TestCommand = new MyDelegateCommand();
(TestCommand as MyDelegateCommand).ExecuteCommand = Test;
(TestCommand as MyDelegateCommand).CanExecuteCommand = CanTest;
//or
//TestCommand = new MyDelegateCommand(Test, CanTest);
} int i = 0;
/// <summary>
/// testcommand执行的方法
/// </summary>
/// <param name="para"></param>
private void Test(object para)
{
i++;
TestStr = i.ToString();
}
/// <summary>
/// testcommand是否可用
/// </summary>
/// <param name="para"></param>
/// <returns></returns>
private bool CanTest(object para)
{
return true;
} #region INotifyPropertyChanged接口实现
public void RaiseChanged(string propertyname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyname));
}
}
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}

其中的Test,CanTest就是之前写在Command中的实现,通过此实现,我们可以将界面呈现逻辑全部集中到ViewModel中。

其界面还是一样使用上一篇的。

 


项目代码托管地址:https://wpfmvvm.codeplex.com/

WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand的更多相关文章

  1. 【转】【WPF】MVVM模式的3种command

    1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因为MVVM模式适合于WPF和SL,所以这3种模式中也有一些小差异,比如RelayCo ...

  2. WPF的MVVM

    一.关于WPF WPF(Windows  Presentation Foundation) ,从名字来看,Microsoft想把WPF技术作为Windows程序外观(表现层)的基础.我们知道,现在开发 ...

  3. WPF之MVVM模式(3)

    有种想写一个MVVM框架的冲动!!! 1.Model中的属性应不应该支持OnPropertyChanged事件? 不应该.应该有ViewModel对该属性进行封装,由ViewModel提供OnProp ...

  4. 【WPF】MVVM模式的3种command

    原文:[WPF]MVVM模式的3种command 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因为MVVM模式适合于WPF和SL, ...

  5. CleanAOP实战系列--WPF中MVVM自动更新

    CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...

  6. WPF简单MVVM实现

    1. MVVM介绍: MVVM就是: Model -- 模型(现实中对象的抽象) View -- UI(用户界面) ViewModel -- UI界面的抽象(给View提供数据,并响应View的操作) ...

  7. 在WPF的MVVM框架中获取下拉选择列表中的选中项

    文章概述: 本演示介绍怎样在WPF的MVVM框架中.通过数据绑定的方式获取下拉列表中的选中项.程序执行后的效果例如以下图所看到的: 相关下载(代码.屏幕录像):http://pan.baidu.com ...

  8. 查杀进程小工具——WPF和MVVM初体验

    最近因为工作需要,研究了一下桌面应用程序.在winform.WPF.Electron等几种技术里,最终选择了WPF作为最后的选型.WPF最吸引我的地方,就是MVVM模式了.MVVM模式完全把界面和业务 ...

  9. WPF使用MVVM(二)-命令绑定

    WPF使用MVVM(二)-命令绑定 上一节已经介绍了WPF的属性绑定,这使得我们只需要指定界面的DataContext,然后就可以让界面绑定我们的属性数据呢. 但是上一节还遗留了一个问题就是我们的按钮 ...

随机推荐

  1. Oracle 级联删除

    alter table ForeignTable(附表)add constraint fk_MainTable_ForeignTable(关联表中的外键) foreign key(ForeignTab ...

  2. 关于Jquery学习的几点反思

    1.应用的API插件时,先看说明文档,仔细看,多花点时间也没关系. 2.写出你要完成工作的几个步骤,细化你的工作.保证每一步结果都是正确(特别是在用你不会的东西的时候),这样看起来是在浪费时间,但是最 ...

  3. Interleaving Positive and Negative Numbers

    Given an array with positive and negative integers. Re-range it to interleaving with positive and ne ...

  4. poj 1789

    http://poj.org/problem?id=1789 这是一道图论的题,个人觉得和那个POJ1258是差不多的,就是多了一步,题目难以读懂 题目的意思:就是给你一群字符串要你找字符串对应的字符 ...

  5. ASM:《X86汇编语言-从实模式到保护模式》1-4章:处理器,内存和硬盘基础

    其实很久之前就学完了实模式了,但是一直没有总结,感觉现在直接在书上做笔记的弊端就是有些知识点不能很很深刻地记下来(毕竟手写最明显的优点就是能深刻地记住知识,但是就是用太多的时间罢了).一下内容都是一些 ...

  6. 【leetcode】Binary Tree Zigzag Level Order Traversal (middle)

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  7. MyEclipse/Eclipse中修改包的显示结构

    操作如下:

  8. 【XLL API 函数】xlSheetId

    查找命名的工作表ID,用于外部引用. 原型 Excel12(xlSheetId, LPXLOPER12 pxRes, 1, LPXLOPER12 pxSheetName); 参数 pxSheetNam ...

  9. java课后作业6

    一.运行TestInherits.java 结论:通过super调用基类构造方法,必须是子类构造方法中的第一个语句. 二.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不 ...

  10. Sightseeing(poj 3463)

    题意:给出n个点m条单向边,求最短路的道路条数和比最短路大1的道路条数的和. /* 用Dijkstra更新2*n次,来更新出所有点的最短路和次短路,顺便更新方案数. */ #include<cs ...