2

我已经为 BindingExpression 类型的 Selector 定义了一个附加属性,以便捕获一个绑定,这样我就可以将它克隆到多个属性上。当 Selector 直接在 XAML 中定义时,附加属性可以正常工作。但是,当在 DataTemplate 中定义 Selector 时,属性更改处理程序永远不会被触发。

附加属性

public static readonly DependencyProperty EnumBindingProperty = DependencyProperty.RegisterAttached(
    "EnumBinding", typeof(BindingExpression), typeof(SelectorHelper),
    new PropertyMetadata(null, OnEnumBindingChanged));

用法(有效)

<ComboBox AttachedProperties:SelectorHelper.EnumBinding="{Binding Phase}" />

用法(无效)

<DataTemplate>
    <ComboBox AttachedProperties:SelectorHelper.EnumBinding="{Binding Phase}" />
</DataTemplate>

这似乎是一个时间问题,因为我发现如果我使用 Snoop 来评估属性,它会自动刷新并开始工作。

任何帮助或解释将不胜感激。:)

4

1 回答 1

1

看起来绑定的评估只是尽可能长时间地延迟,因为表达式只是作为表达式存储而不是评估。您可以通过将附加属性类型更改为 来强制评估object

public static readonly DependencyProperty EnumBindingProperty = DependencyProperty.RegisterAttached(
    "EnumBinding", typeof(object), typeof(SelectorHelper),
    new PropertyMetadata(null, OnEnumBindingChanged));

这将导致绑定尽快评估。然后,您可以在设置属性时从属性中提取 BindingExpression 并使用它,而不是现在直接设置的 BindingExpression 值。

BindingOperations.GetBindingExpression(dObj, EnumBindingProperty)
于 2011-03-21T18:18:46.683 回答