WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand
在自己实现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的更多相关文章
- 【转】【WPF】MVVM模式的3种command
1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因为MVVM模式适合于WPF和SL,所以这3种模式中也有一些小差异,比如RelayCo ...
- WPF的MVVM
一.关于WPF WPF(Windows Presentation Foundation) ,从名字来看,Microsoft想把WPF技术作为Windows程序外观(表现层)的基础.我们知道,现在开发 ...
- WPF之MVVM模式(3)
有种想写一个MVVM框架的冲动!!! 1.Model中的属性应不应该支持OnPropertyChanged事件? 不应该.应该有ViewModel对该属性进行封装,由ViewModel提供OnProp ...
- 【WPF】MVVM模式的3种command
原文:[WPF]MVVM模式的3种command 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因为MVVM模式适合于WPF和SL, ...
- CleanAOP实战系列--WPF中MVVM自动更新
CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...
- WPF简单MVVM实现
1. MVVM介绍: MVVM就是: Model -- 模型(现实中对象的抽象) View -- UI(用户界面) ViewModel -- UI界面的抽象(给View提供数据,并响应View的操作) ...
- 在WPF的MVVM框架中获取下拉选择列表中的选中项
文章概述: 本演示介绍怎样在WPF的MVVM框架中.通过数据绑定的方式获取下拉列表中的选中项.程序执行后的效果例如以下图所看到的: 相关下载(代码.屏幕录像):http://pan.baidu.com ...
- 查杀进程小工具——WPF和MVVM初体验
最近因为工作需要,研究了一下桌面应用程序.在winform.WPF.Electron等几种技术里,最终选择了WPF作为最后的选型.WPF最吸引我的地方,就是MVVM模式了.MVVM模式完全把界面和业务 ...
- WPF使用MVVM(二)-命令绑定
WPF使用MVVM(二)-命令绑定 上一节已经介绍了WPF的属性绑定,这使得我们只需要指定界面的DataContext,然后就可以让界面绑定我们的属性数据呢. 但是上一节还遗留了一个问题就是我们的按钮 ...
随机推荐
- JAVA调用动态链接库DLL之JNative学习
package com.ehfscliax; import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import ...
- Qt 程序运行图标
Qt5 添加程序图标在pro直接添加一句: RC_ICONS+=resource\appicons\app.ico resource程序代码目录下文件夹. Qt4方式 1.在工程文件夹新建一个res目 ...
- 用C#读取txt文件的方法
1.使用FileStream读写文件 文件头: using System;using System.Collections.Generic;using System.Text;using System ...
- [android]如何使LinearLayout布局从右向左水平排列,而不是从左向右排列
方法1: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l ...
- DREAMWEAVER
女孩儿!!!Coding之路,你没有什么不一样的!!!! 1024,程序员的节日,开会的时候,你对负责人说今天是我们的节日哎~~结果,得到的是负责人冷冰冰的眼神:“你还真把自己当程序员了!?” 一阵愣 ...
- 【leetcode】Count and Say (easy)
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- bootstrap添加时间控件
$('#startTime').daterangepicker({ singleDatePicker: true,format:"YYYY-MM-DD HH:mm:ss",time ...
- 手动关闭searchDisplayControlelr
两行代码搞定 [searchBar endEditing:YES]; [searchDisplayControllersetActive:NO];
- July 1st, Week 27th Friday, 2016
It does not do to dwell on dreams, and forget to live. 不要生活在梦里,不要沉醉于空想而疏忽了生活. Stand straightly, and ...
- 创建INnodb的compress表
需要将innodb_file_per_table=1 ,innodb_file_format=Barracuda;; 如: Creating a Compressed Table in a Gener ...