超级简单:如何使用WPF Commands提升你的代码质量


代码:/Files/zhuqil/WpfCommands.zip

介绍:

WPF Commands是一种非常好的的方式去复用应用程序中功能。在本文提供的示例中,创建了一个使用WPF的Command模式来对Customer进行排序的示例。WPFCommand模式非常适合用于在应用程序中的用不同控件调用相同的功能。WPF commands 也能适用于一些其他的情况,例如,如果输入有误,禁用控件。在文章的CanExecute部分中,我们能进一步了解。

创建一个Command:

为了使用WPF commands,你必须声明静态的command。当你声明这个command,你也能确定"Input Gestures"也能调用这个命令。你能把"input gestures" 想象成快捷方式。一些基本的键或者甚至组合键。例如,在示例项目中,我使用F3这个键作为"input gesture"。

代码
///<summary>
///CommandtosorttheCustomers
///AsoucanseethecommandalsohookstotheF3keyofthekeyboard
///</summary>
publicstaticRoutedUICommandSortCustomers=newRoutedUICommand("SortCustomers",
"SortCustomers",typeof(CommandsDemo),newInputGestureCollection(
newInputGesture[]{newKeyGesture(Key.F3,ModifierKeys.None,"SortCustomer")}
));

在这个示例项目中,和用户界面窗体在同一个类(CommandDemo.cs)中创建command。在实际生活中中的项目,我建议将command声明在更重要的地方,好让Windows/Components能使用相同的command声明。例如,如果在项目中的另外一个窗体也能使用customers的排序功能,我会创建一个里面有command的类。这样,这个command能被其他窗体轻易地访问。你能把commands 想象成类似于事件的东西。有人执行该命令,就有人处理命令。在我的脑海中想象这样一幅画面...

有三个家伙Jon,Mark和在商店工作Patrick。商店的经理决定让Patrick去洗地板。Jon说“洗地板”,Patrick就去执行。Mark说“洗地板”,Patrick就去执行。所以,基本上Patrick是Command的处理者,Jon,Mark执行命令致使Patrick(命令处理者)去做这个操作的。经理说Patrick去洗地板是命令的绑定

上面是关于这个模式如何工作的基本解释。也许这个会更令人困惑。按照这样的方式,我们快忘记了...在WPF类中RoutedCommand类似于RoutedEvents。调用者执行这个命令,由WPF Visual Tree指挥路线直到CommandBinding来处理这个命令。在命令处理的时候,通过设置e.Handled = true,将它停止。

现在让我们继续,在定义这个command之后,你必须去做的是如何绑定这个命令。基本上,这意味着你需要指定谁去执行操作。如下:

代码
//Herewecreatehandlethecommandbindingforthewholewindow
//sowhichevercontrolinvokesthiscommandthesamehandlerwillhandlethecommand
CommandBindings.Add(newCommandBinding(SortCustomers,SortCustomersHandler));

//commandbindingforthedeletcustomer
CommandBindings.Add(newCommandBinding(DeleteCustomer,DeleteCustomerHandler,CanExecuteDeleteCustomer));

//handletheCanExecuteChangetosetthetextofthedeletetextblock
DeleteCustomer.CanExecuteChanged+=delegate
{
boolcanExecute=AvalonCommandsHelper.CanExecuteCommandSource(deleteButton);
deleteText.Text
=canExecute?
"Deleteselectedcustomer":
"Selectcustomertodelete";
};

}

//handlerfortheSortCustomerscommand.
//thiseventhandlerwillbeinvokedwhensomeelementwillexecutetheSortCustomersCommand
privatevoidSortCustomersHandler(objectsender,ExecutedRoutedEventArgse)
{
//defaultthesortifnoparameterispassed
stringsortBy=e.Parameter==null?
"Name":
e.Parameter.ToString();

//gettheviewforthelist
ICollectionViewview=CollectionViewSource.GetDefaultView(customerList.ItemsSource);
view.SortDescriptions.Clear();
//addthenewsortdescription
view.SortDescriptions.Add(
newSortDescription(sortBy,ListSortDirection.Ascending));
view.Refresh();
}

那么,留给我们要做的是创建Mark 和Jon,他们才是实际执行这个命令的。 一些控件像button,当这个被点击的时候,有一个command属性让你确定什么命令会被使用(你甚至通过使用CommandParameter属性传递一个参数给这个命令)。

>Command=”local:CommandsDemo.SortCustomers”

使用以下的C#代码,你甚至可以手动地执行命令 :

ICommandcommand=SortCustomers;
command.Execute(”Name”);

第二部分 CanExecute :

WPF的command有另外的一个很酷的功能:CanExecute。基本上这是让您可以检查该命令可以执行与不能执行的一个方法。如果你有一个只能在一定条件下执行的命令,这是一个非常方便的功能。例如,你在一个ListBox的列表中有一用户列表。您希望能够删除用户,你定义需要user id作为参数的命令。您通过获得ListBox中选择项来确定要删除用户。 传递id作为命令的参数。只有当用户选择,您能执行的命令。

在CanExecuteChanged事件处理中,你必须调用ICommand接口的CanExecute方法,为了检查command的当前状态是什么。

代码
//handlerfortheCanexecutechackofthedeletecustomer
privatevoidCanExecuteDeleteCustomer(objectsender,CanExecuteRoutedEventArgse)
{
e.CanExecute
=e.Parameter!=null&&e.ParameterisCustomer;;
e.Handled
=true;
}

如果CanExecute为false通过禁用控件,所有的控件都支持命令模式(例如:button)出处理CanExecute的结果。如果执行命令的控件不支持命令模式,不用担心,因为只有当CanExecute= TRUE的时候才能执行。当然也有(例如,改变控件的visibility或者改变控件的text属性)。 你也能执行这个。

boolcanExecute=command.CanExecute(paramterForCommand);

我创建了一个帮助方法,它接受一个ICommandSource ,返回commandCanExecute 状态。

代码
///<summary>
///GetstheCanExecuteofaspecificcommand
///</summary>
///<paramname="commandSource">Thecommandtoverify</param>
///<returns></returns>
publicstaticboolCanExecuteCommandSource(ICommandSourcecommandSource)
{
ICommandbaseCommand
=commandSource.Command;
if(baseCommand==null)
returnfalse;


objectcommandParameter=commandSource.CommandParameter;
IInputElementcommandTarget
=commandSource.CommandTarget;
RoutedCommandcommand
=baseCommandasRoutedCommand;
if(command==null)
returnbaseCommand.CanExecute(commandParameter);
if(commandTarget==null)
commandTarget
=commandSourceasIInputElement;
returncommand.CanExecute(commandParameter,commandTarget);
}

就像Demo中展示的一样,你能使用这个方法来核实command 的状态,我希望这篇文章能让你更好的理解command是如何运作的,如何使用好它来让你的应用程序代码编写的更好。为了你能更好的使用wpf的Command 模式,你可以下载这篇文章的示例。

参考原文:http://www.codeproject.com/KB/WPF/wpfcommands.aspx



(全文完)


以下为广告部分

您部署的HTTPS网站安全吗?

如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

SSL检测评估

快速了解HTTPS网站安全情况。

安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

SSL证书工具

安装部署SSL证书变得更方便。

SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

SSL漏洞检测

让服务器远离SSL证书漏洞侵扰

TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

优质内容筛选与推荐>>
1、《转》unity3d各种OpenFileDialog操作
2、Windows API一日一练
3、第四篇 HTML 表单深入了解、注释和a标签的运用
4、深入研究java.lang.Class类
5、反射(Reflection)的性能分析


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn