在WPF中,有一个非常有意思的Command Binding(命令绑定机制),这种机制在原有的Windows Form中没有提供。本文设计了一个实例,直观地展示出Command Binding的应用场景,并对其机制进行了剖析。
1 Command Binding有什么用?
这个机制有何作用?看一下下面这个例子就清楚了(图 1),此例是由Visual C# 2008 Express创建的标准Wpf应用程序,项目中有一个Window1.xaml作为主窗体:
窗体上有一个菜单和一个按钮,当用户点击这两个控件时,它们执行相同的功能。
多个控件执行同一个功能在桌面应用程序中是非常常见的,比如相同的命令可以通过选择“菜单”命令或点击工具栏上的特定按钮执行。
以传统方式开发这样的程序,往往需要针对每个控件的Click事件分别编码来实现。
然而,在许多时候我们需要同步多个控件的状态。比如在一个文本编辑器中 ,当用户没有选中任何文本时,菜单中的“Copy”和工具栏上的“Copy”按钮都需要禁用,因此,传统方式下还必须写额外代码来实现这一点。
Command Binding弥补传统编程方式的缺陷,可以帮助我们以很少的代码实现同样的功能。
2 实现Command Binding
让我们修改示例以利用命令绑定机制。
首先,向项目中加入一个MyAppCommands类,其内容如下:
namespace UnderStandCommandBinding
{
public class MyAppCommands
{
public static RoutedUICommand MyCommand = new RoutedUICommand();
}
}
请特别注意其中的RoutedUICommand 类型的字段MyCommand。它定义了一个将被窗体控件所调用的命令。
在Window1.cs中书写以下代码:
partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
CommandBinding cb = new CommandBinding();
cb.Command = MyAppCommands.MyCommand;
cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
}
void cb_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("响应自定义命令MyCommand");
}
}
上述代码创建一个CommandBinding对象,此对象指明cb_Executed函数响应MyCommand命令(其实是被MyCommand命令的Execute方法自动调用,这里借用事件处理机制的相关术语以便于理解,事实上,命令绑定与事件响应不是一回事,简单地说,命令绑定建构于Wpf的事件路由机制之上)。
下一步则需要指定窗体上的哪几个控件用于调用此命令:
partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
//创建命令对象
CommandBinding cb = new CommandBinding();
cb.Command = MyAppCommands.MyCommand;
cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);
//将要执行的命令对象添加到窗体的命令对象集合中
this.CommandBindings.Add(cb);
//设定菜单项和按钮都执行MyCommand命令
mnuInvokeMyCommand.Command = MyAppCommands.MyCommand;
btnInvokeMyCommand.Command = MyAppCommands.MyCommand;
}
void cb_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("响应自定义命令MyCommand");
}
}
现在运行程序,可以发现,单击菜单项和按钮都会调用cb_Executed函数。
3 使用XAML实现DataBinding
前面使用代码实现了数据绑定。现在,改用XAML实现相同的功能。
首先,删除Window1构造函数中的代码,只留下cb_Executed()函数:
partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
void cb_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("响应自定义命令MyCommand");
}
}
回到Window1.xaml文件中,首先,在其Window元素中加入对本项目命名空间的引用(其目的是在XAML中使用代码中的类):
xmlns:myapp="clr-namespace:UnderStandCommandBinding">
……
然后,修改MenuItem的声明,加上Command属性:
0 评论:
发表评论