Привязка к ElementName зависит от порядка привязки

Я создал простой StateTrigger для привязки к свойству FrameworkElement Width. Есть три свойства зависимостей: MinValue, MaxValue и Element. Типы double, double и FrameworkElement соответственно.

И я заметил, что в зависимости от порядка привязки это может работать или не работать.

Это прекрасно работает.

<local:ElementWidthTrigger MaxValue="1000"
                           MinValue="800"
                           Element="{Binding ElementName=LayoutRoot}" />

А это не так.

<local:ElementWidthTrigger Element="{Binding ElementName=LayoutRoot}"
                           MaxValue="1000"
                           MinValue="800" />

Заметил, что единственная разница в этих двух примерах — порядок привязки свойств Element.

В ElementWidthTrigger есть обратный вызов изменения свойства для каждого свойства зависимости. А когда Element в самом верху, то callback ни разу не вызывался, несмотря ни на что.

x:Bind решает эту проблему независимо от того, какой порядок используется, но остается вопрос. Может ли кто-нибудь объяснить, почему свойство Element не может быть привязано в зависимости от порядка привязки?

Работает на Windows 10 1803, сборка 17134.320.

Рабочий пример проекта можно найти здесь.


person khamitimur    schedule 09.10.2018    source источник
comment
Очень хорошая работа, чтобы написать это!   -  person Lynn Crumbling    schedule 11.10.2018


Ответы (2)


Спасибо, что сообщили об этой проблеме и предоставили надежный репродукционный проект - это ошибка платформы. Я зарегистрировал его в нашей базе данных и назначил нужной команде. Спасибо еще раз!

person Stefan Wick MSFT    schedule 13.10.2018

Вау, это загадка! Хотя мне не удалось выяснить причину проблемы, это действительно похоже на ошибку в UWP. Я заметил, что простое действие добавления x:Name к одному из VisualStates заставит даже ElementName-первый порядок работать как положено:

<VisualState x:Name="Test">
    <VisualState.StateTriggers>
        <local:ElementWidthTrigger Element="{Binding ElementName=LayoutRoot}"
                                   MaxValue="1000"
                                   MinValue="800" />
    </VisualState.StateTriggers>

    <VisualState.Setters>
        <Setter Target="Rectangle.Fill" Value="Blue" />
    </VisualState.Setters>
</VisualState>

Было бы здорово, если бы кто-то из команды UWP увидел это и помог, так как, вероятно, требуется понимание внутренностей, чтобы понять, что происходит.

person Martin Zikmund    schedule 09.10.2018
comment
Хорошая находка! Случай с x:Name не тестировал. Выглядит как хорошее временное исправление для шаблонных элементов управления. - person khamitimur; 09.10.2018