如果 Blend 行为不支持绑定,那么它们几乎没有用处!我重新创建了您的倾斜行为,并且在 Blend 4 中支持绑定,没有任何问题,所以我不知道您出了什么问题。也许您可以重现我的简单示例,然后推断出您的设置有什么问题。
以下是(无效的)具有依赖属性的倾斜行为:
public class TiltBehavior : Behavior<FrameworkElement>
{
public double TiltFactor
{
get { return (double)GetValue(TiltFactorProperty); }
set { SetValue(TiltFactorProperty, value); }
}
public static readonly DependencyProperty TiltFactorProperty =
DependencyProperty.Register("TiltFactor", typeof(double), typeof(TiltBehavior), new UIPropertyMetadata(0.0));
}
然后创建一个新窗口并将行为拖放到网格上,Blend就会创建出这样的效果:
<Grid>
<i:Interaction.Behaviors>
<local:TiltBehavior/>
</i:Interaction.Behaviors>
</Grid>
在属性选项卡中,Blend的“数据绑定...”选项可用。
我已经在WPF和Silverlight项目中进行了测试。内置的行为、触发器和动作都支持绑定,因为它们都是依赖属性,并且所有Blend示例都大量使用绑定,所以这一点必须要有效。
实际上,您只需将内置行为(例如FluidMoveBehavior
)拖放到网格上并检查其是否支持绑定(例如依赖属性Duration
),即可验证其是否支持绑定。如果这样做不起作用,那我就无能为力了!
那么我们来考虑一下绑定如何适用于这些奇怪的行为。
作为WPF或Silverlight程序员,我们非常熟悉为FrameworkElement
等事物绑定。它有一个称为DataContext
的属性,我们可以操纵它来控制默认的绑定源,并且当我们没有覆盖它时,该属性会被嵌套元素继承。
但是行为(以及触发器和动作)不是FrameworkElement
类型。它们最终是从DependencyObject
派生出来的,这是我们所期望的。但是,虽然我们可以在DependencyObject
的任何派生类上使用绑定,但在这个低级别上,我们熟悉的DataContext
缺失了,因此绑定必须提供源。 这并不方便。
因此,在WPF中,行为是从Animatable
派生出来的,而Animatable
又是从Freezable
派生出来的。 Freezable
类是简单的依赖对象与框架元素复杂性相交的地方。 Freezable
类也是更熟悉的东西(例如画笔和图像源)的基类。这些类不需要框架元素的全部复杂性,但它们希望以一种有限的方式参与与其相关联的元素。
通过一个复杂的魔法过程,Freezable
实例获得继承上下文:它们最密切关联的框架元素,并且当使用默认绑定(没有源)时,Freezable
使用其关联元素的DataContext
。
实际上,当您学习行为时,AssociatedObject
是一个核心概念;对于行为,它是行为所附加的对象。 但重要的一点是,所有Freezable
对象都可以通过代理使用其AssociatedObject
的DataContext
。
所有这些魔法就是Josh Smith所说的:
由于Hillberg Freezable Trick,因此Blend行为支持使用关联元素的数据上下文作为默认来源进行绑定。这意味着,行为的绑定似乎“自动工作”,无需我们进行任何努力。正是由于此,行为变得更加实用。