Почему вложенное свойство типа BindingExpression не оценивается при помещении в DataTemplate? - PullRequest
2 голосов
/ 17 марта 2011

Я определил вложенное свойство для Selector типа BindingExpression, чтобы перехватить привязку, чтобы можно было клонировать ее по нескольким свойствам. Присоединенное свойство прекрасно работает, когда селектор определен непосредственно в XAML. Однако, когда селектор определен внутри DataTemplate, обработчик измененного свойства никогда не запускается.

Недвижимость

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 для оценки свойства, он автоматически обновляется и начинает работать.

Любая помощь или объяснение будет с благодарностью. :)

1 Ответ

1 голос
/ 21 марта 2011

Похоже, что оценка привязки просто задерживается как можно дольше, поскольку выражение просто сохраняется как выражение и не оценивается.Вы можете принудительно выполнить оценку, изменив тип присоединенного свойства на object.

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

. Это приведет к оценке привязки как можно скорее.Затем вы можете извлечь BindingExpression из свойства, когда оно установлено, и использовать его вместо непосредственно установленного значения BindingExpression, которое есть сейчас.

BindingOperations.GetBindingExpression(dObj, EnumBindingProperty)
...