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
}

 

源代码下载

 

posted @ 2010-12-30 13:44  焦涛  阅读(1787)  评论(0编辑  收藏  举报