Blend中行为与Command

            本篇学习了Blend中的行为!并通过Command实现MVVM控制行为!

(一)基本概念:

1) 触发器Trigger: 是一种对象,该对象侦听特定条件(例如事件触发或属性设置为某个值),并调用一项或多项关联的 Actions 作为响应  
    (1)Blend内置触发器:DataStoreChangedTrigger、DataTrigger 、EventTrigger、KeyTrigger、PropertyChangedTrigger、StoryboardCompletedTrigger、TimerTrigger
    (2) Triggers 从 EventTrigger (在引发鼠标或键盘事件时触发 Action )到 CollisionTrigger (在两个对象彼此冲突时触发 Action )不尽相同。Triggers可以扩展,因此您可以创建出创意无限的自定义触发器

2) 操作(Action):是只能“执行” 某些操作的对象
    (1)Trigger 将调用 Invoke 方法,因此请确保希望 Action 执行的任何代码可采用 Invoke 方法内的某种形式进行访问
    (2)为了将 Action 的目标确定为另一个元素,请从 TargetedTriggerAction中扩展表示Action 的类
    (3)从TargetedTriggerAction 中扩展了类后,您将能够使用 TargetName 和 Target 属性访问目标元素

3) 行为(Behavior):
    (1)在没有来自 Trigger 或类似 Trigger 的项目的任何外部通知的情况下, Behavior 也可以执行。尽管必须满足某种条件,但它不必由 Trigger 调用
    (2扩展 Behavior 类,并将其约束为希望 Behavior 与之关联的类型)您可以将希望在以下条件下运行的任何代码放在 Behaviors 的 OnAttached 和 OnDetaching 方法中:将 Behavior 与对象关联时或将它从其当前关联的对象分离时
    (3)允许用户自定义行为功能的一种方式是公开 Commands (类型为 ICommand 的任何属性),其中每个命令都对应于 Behavior 可执行的一项操作
    (4)通过将 Triggers 添加到 Behavior 中,并让这些 Triggers 触发一个或多个 InvokeCommandActions .InvokeCommandAction 仅执行一项操作:调用 Behavior 公开的 Command

(二)    您可以使用三种类型的行为: Behavour、 TriggerAction 和 TargetedTriggerAction。如图:

(三)代码示例:实现的是取得鼠标移动时的位置。参考:http://www.cnblogs.com/888h/archive/2010/12/18/1910167.html

老外的文章:http://blog.roboblob.com/2010/01/26/binding-ui-events-from-view-to-commands-in-viewmodel-in-silverlight-4/

(1)添加一个行为:在Blend中添加新项。选择(Action)项

(2)在Action中代码如下(这里只写出主要代码):

代码
public static readonly DependencyProperty CommandProperty = DependencyProperty.Register( " Command " , typeof (ICommand), typeof (ExtendedInvokeCommandAction), new PropertyMetadata( null , CommandChangedCallback));
public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register( " CommandParameter " , typeof ( object ), typeof (ExtendedInvokeCommandAction), new PropertyMetadata( null , CommandParameterChangedCallback));
public ExtendedInvokeCommandAction()
{
// Insert code required on object creation below this point.
}
private static void CommandParameterChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var invokeCommand
= d as ExtendedInvokeCommandAction;
if (invokeCommand != null )
invokeCommand.SetValue(CommandParameterProperty, e.NewValue);
}
private static void CommandChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var invokeCommand
= d as ExtendedInvokeCommandAction;
if (invokeCommand != null )
invokeCommand.SetValue(CommandProperty, e.NewValue);
}

// 确保希望 Action 执行的任何代码可采用 Invoke 方法
protected override void Invoke( object parameter)
{
if ( this .Command == null )
return ;

if ( this .Command.CanExecute(parameter))
{
var commandParameter
= new ExtendedCommandParameter(parameter as EventArgs, this .AssociatedObject,
GetValue(CommandParameterProperty));
this .Command.Execute(commandParameter);
}
}
#region public properties

public object CommandParameter
{
get { return GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}

// 公开 Commands (类型为 ICommand 的任何属性)
public ICommand Command
{
get { return GetValue(CommandProperty) as ICommand; }
set { SetValue(CommandParameterProperty, value); }
}

#endregion
}

 

源代码下载

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值