混合行为 - 你能绑定到他们的属性吗?

Col*_*inE 7 silverlight wpf attachedbehaviors expression-blend

我目前正在将我创建的一些附加行为迁移到Blend Behaviors,以便它们支持Expression Blend中的拖放.我注意到Blend行为的作者倾向于将行为属性定义为依赖属性.

我创建了一个行为,TiltBehaviour它公开了一个TiltFactordouble类型的公共依赖属性.在Expression Blend中我可以设置此属性的值,但是,添加"数据绑定..."的选项显示为灰色:

无法绑定到行为属性

我还注意到Behaviors扩展DependencyObject,因此它们没有a DataContext,因此无法继承DataContext它们所附加的元素.这对我来说真是个弱点!

所以,底线是,如果我无法在Blend中设置绑定到我的行为依赖属性,并且它没有继承DataContext,为什么还要使用依赖属性呢?我可以使用CLR属性.

Ric*_*key 8

除非支持绑定,否则混合行为几乎无用!我重新创建了你的倾斜行为,它支持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));
}
Run Code Online (Sandbox Code Playgroud)

然后只需创建一个新窗口并将行为放到网格上,Blend就会创建:

<Grid>
    <i:Interaction.Behaviors>
        <local:TiltBehavior/>
    </i:Interaction.Behaviors>
</Grid>
Run Code Online (Sandbox Code Playgroud)

和属性"数据绑定..."选项在属性选项卡中可用.

我用WPF和Silverlight项目测试了这个.内置的行为,触发器和动作都支持绑定,因为使用了依赖属性,所有Blend示例都使用了大量绑定,所以这必须起作用.

实际上,您可以将内置行为FluidMoveBehavior放到网格上,并检查Duration它是依赖属性,是否支持绑定.如果这不起作用,我知道发生了什么!


让我们考虑一下这些奇怪的野兽被称为行为的绑定是如何起作用的.

作为WPF或Silverlight程序员,我们非常熟悉像FrameworkElement.它有一个属性DataContext,我们可以操作来控制默认绑定源,当我们覆盖它时,该属性由嵌套元素继承.

但是行为(以及触发器和动作)属于类型FrameworkElement.DependencyObject正如我们所料,它们最终来源于.但是虽然我们可以对派生的任何类使用绑定DependencyObject,但我们熟悉的DataContext是在这个低级别缺少,因此绑定必须提供源. 不是很方便.

因此行为都源于(上WPF反正)AnimatableAnimatable源自Freezable.的Freezable类是其中依赖性对象的简单性与框架元件的复杂性相交.该Freezable班也是一样的画笔和图像源更熟悉的东西的基类.这些类不需要框架元素的完全复杂性,但是他们希望以有限的方式参与它们所关联的元素.

通过一个复杂的魔法过程,Freezable实例获得了一个继承上下文:它们与它们关系最密切的框架元素,当使用默认绑定(一个没有源)时,Freezable使用DataContext它的相关元素.

事实上,当你了解行为时,这AssociatedObject是一个核心概念; 对于行为,行为是附加到的事物.但重要的是,所有Freezable对象都可以使用DataContext它们AssociatedObject的代理.

所有这些魔力都是约什史密斯所说的:

所以这一切导致了以说,由于Hillberg可冻结计谋,混合行为支持使用它们相关联的元素作为默认信号源的数据上下文绑定.因此,对行为的绑定似乎"正常工作"而我们没有任何努力.因此,行为是有用的一千倍.


H.B*_*.B. 4

编辑: dain 是正确的,您仍然可以绑定到人工创建的 DataContext,您多久看到人们绑定到 a SolidColorBrush.Color?即使 SolidColorBrush 继承自 DependencyObject 因此没有 DataContext,它也可以工作。

请参阅这篇关于继承上下文的博客文章

问题是,由于行为是附加的,它们不会出现在逻辑树中,因此无论如何也不会继承 DataContext。