WPF学习之路(六)Command

在WPF中,命令绑定机制是相比于事件更高级的概念,把应用程序的功能划分为多个任务,任务由多种途径触发。

应用Command Binding使代码更符合MVVM模式(Model-View-ViewModel),类似于MVC模式(Model-View-Control)。这两种模式在以后的BLOG中会有详细的介绍。目的都是为了更好的分离前后台逻辑。

一个简单的Button

<Button Content="Button" Click="Button_Click" />
private void Button_Click(object sender, RoutedEventArgs e)
{
        MessageBox.Show("Hello WPF");
}

前台显示需要通过Button_Click方法跟后台关联上,如果想更好的分离这两部分,将Click事件替换成Command

自定义Command

using System;
using System.Windows;
using System.Windows.Input;

public class MyCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        MessageBox.Show("Hello WPF");
    }
}
<Button Content="Button" x:Name="btn1" />
public MainWindow()
{
  InitializeComponent();
  btn1.Command = new MyCommand();
}

现在逻辑已经被分离到MyCommand中了

使用预定义Command

ApplicationCommands提供了很多预定义Command

<Button Content="Button" x:Name="btn2" Command="ApplicationCommands.Close"/>

但是这些命令并没有实现 ("▔□▔)

使用Command Binding添加逻辑

public MainWindow()
{
    InitializeComponent();var OpenCmdBinding = new CommandBinding(
        ApplicationCommands.Close,
        OpenCmdExecuted,
        OpenCmdCanExecute);

    this.CommandBindings.Add(OpenCmdBinding);
}

void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
    this.Close();
}

void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}

有些控件没有Command属性

<Button Grid.Row="2" Height="100" Width="100" HorizontalAlignment="Left" Content="Decrease"  Command="Slider.DecreaseLarge"  CommandTarget="{Binding  ElementName=slider}"/>
<Slider Grid.Row="2" x:Name="slider"  Width="100"></Slider>
<Button Grid.Row="2" Height="100" Width="100" HorizontalAlignment="Right" Content="Increase"  Command="Slider.IncreaseLarge"  CommandTarget="{Binding  ElementName=slider}"/>

CommandParameter可以给命令传递一个值

CommandTarget:触发的命令目标

更多的Command介绍

http://www.cnblogs.com/Curry/archive/2009/07/27/1531798.html

http://www.cnblogs.com/gaixiaojie/archive/2010/09/01/1815015.html

To be continue...

时间: 2024-10-27 18:14:58

WPF学习之路(六)Command的相关文章

WPF学习之路(一) 初识WPF

参考<葵花宝典-WPF自学手册> VS2012 先创建第一个WPF小程序 1.创建WPF程序 2.查看Solution,WPF中xaml文件和cs文件经常成对出现 两个主要的类:APP(WPF主程序) MainWindow(程序主窗口) 3.添加Button和Click事件 MainWindow.xaml <Grid> <Button Content="Hello WPF" Margin="5" Click="Button_C

WPF学习之路(九)导航链接

Hyperlink WPF中超链接类型是Hyperlink,除了能在页面之间导航,还能再同一个页面下进行段落导航 实例: <Grid> <FlowDocumentReader> <FlowDocument> <Section LineHeight="25" FontSize="15"> <List> <ListItem> <Paragraph> <Hyperlink Navig

Wpf学习之路……

Wpf是 .net中一门做winform的技术,和传统的winform的区别在于: 1.         原来的winform就是拖控件,而wpf的控件都死自己拿标记语言(xaml)来写,类似于web中的html. 2.         开发的模式不一样,winform是mvp事件驱动,比如你得单机刷新按钮,界面的数据才会更新.而wpf是mvvm数据驱动,一旦后台的数据发生了改变,前台界面会自己更新.(初学者不用太纠结这个,先学会怎么用吧.) 两者的优缺点是:winform简单,开发快捷,只需要

react.js学习之路六

学习react中,我一直认为,总组件里面才有构造函数,但是我才发现我的观点是错误的,构造函数是可以出现在子组件里面的. 今天有一个错误是点击增加/减少input框里面 的数值 我一直在寻找input框里面的数值,也就是value值,我发现我的思维错误的很彻底.react只是view,是不能操作数据的,只能渲染原始数据的变化,换句话说就是我要改变数值,只能改变原始数据里面的值,然后重新渲染到input框里面. 我的原始数据,给了 value:1; 当点击时候,构造函数 add(e){ var nu

WPF学习之路(八)页面

传统的应用程序中有两类应用程序模式:桌面应用,Web应用.WPF的导航应用程序模糊了这两类应用程序的界限的第三类应用程序 WPF导航表现为两种形式,一是将导航内容寄宿于窗口,二是XAML浏览器应用程序 四个核心要素:Page\HyperLink\NavigationServices\Journal Page WPF中的Page相比Window来说更加的精简,没有提供一个Show或者是Hide的方法,而是通过链接的方式进行页面切换.一般来说Page不设置自身的大小,因为页面的尺寸由包含它的宿主窗体

WPF学习之路(十)实例:用户注册

通过一个注册用户的实例了解页面间数据的传递 首先构建一个User类  User.cs public class User { private string name; public string Name { get { return this.name; } set { this.name = value; } } private string password; public string Password { get { return this.password; } set { this

WPF学习之路(二) XAML(续)

属性 简单属性 前面用到的Width/Height都是简单属性,其赋值一定要放到双引号里 XAML解析器会根据属性的类型执行隐式转换 与C#的区别 SolidBrush.Color = Colors.AliceBlue; <Button Color = "AliceBlue" /> C#中有的枚举类型可以用(|)运算符组合,在XAML中用(,)分隔 附加属性 附加属性可以用于多个控件,但是在另外一个类中定义的属性,在WPF中常常用于布局 如DockPanel.Dock=&q

WPF学习之路(五) 实例:写字板(续)

WordPad 2.0 上一期实现了一虽然建议但是功能比较全面的Wordpad程序,但是程序代码略显繁琐,这一期更新改进版. MainWindows.xaml 添加 <Window.CommandBindings>节点,响应保存和关闭命令 <Window.CommandBindings> <CommandBinding Command="Close" Executed="CloseCommand" /> <CommandBi

WPF学习之路(三) 属性与依赖

类型是DependencyProperty的属性是依赖属性 依赖属性不同于普通的.Net属性,类似于一个计算过程,根据依赖的值得到最终值. 为什么引入依赖属性: MSDN原文 One of the primary architectural philosophies used in building WPF was a preference for properties over methods or events. WPF的设计思想是侧重属性胜于方法和事件. 实例 依赖属性对资源引用的支持 设