在这里我打算分享一个十分轻量级的技巧实现Silverlight4中的Command。

Step 1 – 实现ICommand接口

第一步是新建一个类来管理Command相关的逻辑,它需要实现ICommand接口。当然,还有很多其他的方式,我在这里只介绍这种简单有效的实现。

DelegatedCommand类实现了ICommand接口定义的CanExecute、Execute方法和CanExecuteChanged事件。

public class DelegateCommand : ICommand {Func<object, bool> canExecute;Action<object> executeAction;bool canExecuteCache;public DelegateCommand(Action<object> executeAction, Func<object, bool> canExecute) {this.executeAction = executeAction;this.canExecute = canExecute;}#region ICommand 成员public bool CanExecute(object parameter) {bool temp = canExecute(parameter);if (canExecuteCache != temp) {canExecuteCache = temp;if (CanExecuteChanged != null) {CanExecuteChanged(this, new EventArgs());}}return canExecuteCache;}public event EventHandler CanExecuteChanged;public void Execute(object parameter) {executeAction(parameter);}#endregion
}

Step 2 – 定义Command

在你的ViewModel中增加一个公共属性对外提供ICommand。一般来说,这个属性会绑定到界面的按钮上。

public ICommand LoadProductsCommand { get; set; }

Step 3 – 创建Command

在你的ViewModel的构造函数中通过第一步中创建的DelegateCommand类实例化LoadProductsCommand。

LoadProductsCommand = new DelegateCommand(LoadProducts, CanLoadProducts);

Step 4 – 创建ViewModel

接下来你需要确认你的View可以和你的ViewModel通信。很多方式都可以实现这一点,这里我是将ViewModel在XAML中定义为一个静态资源。

<UserControl.Resources><local:ProductViewModel x:Key="vm"/>
</UserControl.Resources>

Step 5 – 绑定到Command

向UI中添加一个按钮然后将你ViewModel中创建的Command属性绑定到这个按钮上。接下来你可能需要通过设置绑定中的CommandParameter向Command传递参数,这里可以是一个UI元素,如TextBox。

<Button Content="Load" Width="120"    Command="{Binding LoadProductsCommand}"    CommandParameter="{Binding ElementName=FilterTextBox, Path=Text}" />

就此5步,你的应用程序已经实现Command了。

附录 …

ProductViewModel的全部代码:

public class ProductViewModel : ViewModelBase {public ProductViewModel() {this.Products = new ObservableCollection<Product>();// 注意: 这里只是代码示例   // ViewModel中不应为Model定义数据:-)   // 我们可以通过调用服务得到Model所需数据. this.AllProducts = new ObservableCollection<Product>();this.AllProducts.Add(new Product { ProductId = 1, ProductName = "Apple" });this.AllProducts.Add(new Product { ProductId = 2, ProductName = "Orange" });this.AllProducts.Add(new Product { ProductId = 3, ProductName = "Banana" });this.AllProducts.Add(new Product { ProductId = 4, ProductName = "Pear" });this.AllProducts.Add(new Product { ProductId = 5, ProductName = "Grape" });this.AllProducts.Add(new Product { ProductId = 6, ProductName = "Grapefruit" });this.AllProducts.Add(new Product { ProductId = 7, ProductName = "Strawberry" });this.AllProducts.Add(new Product { ProductId = 8, ProductName = "Melon" });this.AllProducts.Add(new Product { ProductId = 9, ProductName = "Guava" });this.AllProducts.Add(new Product { ProductId = 10, ProductName = "Kiwi" });this.AllProducts.Add(new Product { ProductId = 11, ProductName = "Pineapple" });this.AllProducts.Add(new Product { ProductId = 12, ProductName = "Mango" });LoadProductsCommand = new DelegateCommand(LoadProducts, CanLoadProducts);}private void LoadProducts(object param) {string filter = param as string ?? string.Empty;this.Products.Clear();var query = from p in this.AllProductswhere p.ProductName.ToLower().StartsWith(filter.ToLower())select p;foreach (var item in query) {this.Products.Add(item);}}private bool CanLoadProducts(object param) {return true;}public ICommand LoadProductsCommand { get; set; }public ObservableCollection<Product> AllProducts { get; set; }private ObservableCollection<Product> products;public ObservableCollection<Product> Products {get {return products;}set {products = value;this.FirePropertyChanged("Product");}}
}
接下来是ViewModelBase类的全部代码,很简单的一个类,主要用来辅助包装PropertyChanged。
我项目中的所有ViewModel都继承了这个类。
public abstract class ViewModelBase : INotifyPropertyChanged {public ViewModelBase() {}public event PropertyChangedEventHandler PropertyChanged;protected void FirePropertyChanged(string propertyname) {var handler = PropertyChanged;if (handler != null)handler(this, new PropertyChangedEventArgs(propertyname));}

}

本文转自紫色永恒51CTO博客,原文链接:http://www.cnblogs.com/024hi/archive/2010/02/23/1671683.html ,如需转载请自行联系原作者

[译]5步实现Silverlight中的Command相关推荐

  1. Silverlight实用窍门系列:63.Silverlight中的Command,自定义简单Command

    在Silverlight中的MVVM模式下将前台页面和ViewModel界面交互分离开是通过本节所要讲述的Command实现的.我们自定义一个Command需要继承于ICommand接口并且实现这个接 ...

  2. 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  3. 一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码_转载...

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  4. 一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  5. 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://terrylee.blog.51cto.com/342737/67260 ...

  6. 一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScriptjavascript

    一步一步学silverlight 2系列(21):如何在silverlight中调用javascript 概述 silverlight 2 beta 1版本发布了,无论从runtime还是tools都 ...

  7. 一步一步学动画[1]:Silverlight中Animation的应用

    1.Animation简介 动画是快速播放一系列图像(其中每个图像与下一个图像略微不同)给人造成的一种幻觉.大脑感觉这组图像是一个变化的场景.在电影中,摄像机每秒钟拍摄许多照片(帧),便可使人形成这种 ...

  8. WPF/Silverlight中MVVM运用

    随着WPF/Silverlight等技术的出现,一种新的模式出现在大家面前,那就是MVVM,提到这个模式,大家也许感觉很迷惑,也许会不屑于故,也许你会说我现在做项目都形成了自己的框架了,为什么还要花费 ...

  9. 一步一步学Silverlight 2系列(3):界面布局

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

最新文章

  1. javascript数据结构与算法-队列
  2. ubuntu16.04: mininet下使用ryu当做控制器
  3. 开发日记-20190803 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 19
  4. Node.js~在linux上的部署~外网不能访问node.js网站的解决方法
  5. bootstrap框架中data-xxx 的属性
  6. 直播平台搭建中你需要注意的小细节
  7. 英文名字大全(男篇)
  8. ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接
  9. mysql 修改库的校对集_mysql数据库的基本操作(增删改查、字符集、校对集)
  10. 知识图谱能否拯救NLP的未来?
  11. 行高引起的行内块级元素间距
  12. TypeScript开发手册
  13. android support-v4、v7、v13
  14. ajax、axios、fetch之间的详细区别以及优缺点
  15. [SNMP超详解]:简介、抓包分析与编程实战
  16. dlna和miracast可以共存吗_解决播放网络视频卡顿及DLNA和Miracast容易掉线的方法
  17. html导航栏固定在顶部,将导航栏始终固定在窗口顶部:
  18. python操作redis-sentinel集群
  19. 【力扣】714. 买卖股票的最好时机含手续费
  20. 微信小程序源代码_下厨房菜谱APP

热门文章

  1. 《水泥公司信息管理系统》Access学习心得
  2. html5倒计时秒杀怎么做,vue 设计一个倒计时秒杀的组件
  3. C语言——实现用链表存储学生信息,当输入0退出输入,并查找学号为3的学生是否存在
  4. 软件架构阅读笔记15
  5. 蓝桥杯java 算法提高 摆花
  6. GIS-001-gdal软件下载地址
  7. jQuery命名空间,插件开发
  8. 关于K-Meleon浏览器的使用技巧汇总
  9. poj3687Labeling Balls
  10. 爱情,这种高级玩意儿--一个码农的自白