gpt4 book ai didi

wpf - 混合行为 - 你能绑定(bind)到它们的属性吗?

转载 作者:行者123 更新时间:2023-12-04 10:43:50 25 4
gpt4 key购买 nike

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

我创建了一个行为,TiltBehaviour ,它公开了一个公共(public)依赖属性,TiltFactor , double 型。在 Expression Blend 中,我可以设置此属性的值,但是,添加“数据绑定(bind) ...”的选项显示为灰色:

cannot bind to behaviour property

我还注意到行为扩展了 DependencyObject ,因此它们没有 DataContext因此不能继承 DataContext它们所附着的元素。这对我来说就像一个真正的弱点!

所以,底线是,如果我不能在 Blend 中设置我的行为依赖属性的绑定(bind),并且它不继承 DataContext ,为什么还要使用依赖属性呢?我可以只使用 CLR 属性。

最佳答案

除非它们支持绑定(bind),否则混合行为几乎毫无用处!我重新创建了你的倾斜行为,它支持在 Blend 4 中毫无问题地绑定(bind),所以我不知道你到底哪里出错了。也许您可以重现我的简单示例,然后推断您的设置有什么问题。

这是具有依赖属性的(非功能性)倾斜行为:

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>

并且属性选项卡中提供了混合“数据绑定(bind)...”选项。

我用 WPF 和 Silverlight 项目对此进行了测试。内置的行为、触发器和 Action 都通过使用依赖属性来支持绑定(bind),并且所有 Blend 示例都大量使用绑定(bind),因此 去工作。

事实上,你可以放弃像 FluidMoveBehavior 这样的内置行为。到您的网格上并检查 Duration ,它是一个依赖属性,支持绑定(bind)。如果这不起作用,我有 没有知道发生了什么!

让我们考虑一下绑定(bind)是如何对这些称为行为的奇怪野兽起作用的。

作为 WPF 或 Silverlight 程序员,我们非常熟悉诸如 FrameworkElement 之类的绑定(bind)。 .它有一个名为 DataContext 的属性。我们可以操纵它来控制默认绑定(bind)源,并且当我们 时,该属性由嵌套元素继承。不要覆盖它。

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

所以行为是从 Animatable 派生的(无论如何在 WPF 上)和 Animatable源自 Freezable . Freezable类是依赖对象的简单性与框架元素的复杂性相交的地方。 Freezable class 也是更熟悉的东西(如画笔和图像源)的基类。这些类不需要框架元素的全部复杂性,但它们希望参与到 中。有限的方式与它们关联的元素。

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

事实上,当您了解行为时, AssociatedObject是一个中心概念;对于行为,它是行为所依附的事物。但重要的一点是所有 Freezable对象可以使用 DataContext他们的 AssociatedObject通过代理。

所有这些魔法就是 Josh Smith调用:
  • Hillberg Freezable Trick

  • 所以这一切都导致说,由于 Hillberg Freezable Trick,Blend 行为支持使用其关联元素的数据上下文作为默认源进行绑定(bind)。结果,行为绑定(bind)似乎“正常工作”,无需我们付出任何努力。因此,行为的用处要大一千倍。

    关于wpf - 混合行为 - 你能绑定(bind)到它们的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276557/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com