DataTrigger от взаимодействия не работает Windows Phone

У меня есть простой пример, и привязка данных с использованием TemplatedParent не работает. Кто-нибудь знает, что не так?

  <Button Background="Red" Content="xD">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <Border>
                    <i:Interaction.Triggers>
                        <ec:DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Background}" Value="Red">
                            <ec:ChangePropertyAction PropertyName="Background" Value="CadetBlue"/>
                        </ec:DataTrigger>
                    </i:Interaction.Triggers>
                </Border>
            </ControlTemplate>
        </Button.Template>
    </Button>

Нет ошибки в выводе. Фон должен быть установлен на CadetBlue, но эффект не применяется.


person Maximus    schedule 30.10.2014    source источник
comment
не могли бы вы поподробнее рассказать, как это не работает? какие-либо исключения или сообщения об ошибках в окне Вывод?   -  person King King    schedule 30.10.2014
comment
Я думаю, что режим TemplatedParent можно использовать только для ControlTemplate, в данном случае он используется для Border.   -  person King King    schedule 30.10.2014
comment
Он также не работает.   -  person Maximus    schedule 30.10.2014


Ответы (1)


Кажется, что RelativeSource.TemplatedParent нормально работает внутри шаблона, но триггеры не работают должным образом: если условие триггера изначально совпадает, триггер/действие не срабатывает. Если вы программно измените связанное свойство, триггер сработает. Вот почему это работает с IsPressed: кнопка не начала нажиматься; она была нажата после загрузки.

Если вы переместите триггеры из шаблона и прикрепите их непосредственно к кнопке и соответствующим образом настроите привязки, все должно просто работать:

<Button x:Name="_button"
        Background="Red"
        Content="xD">
  <i:Interaction.Triggers>
    <ei:DataTrigger Binding="{Binding ElementName=_button, Path=Background.Color}"
                    Value="Red">
      <ei:ChangePropertyAction PropertyName="Background"
                               Value="CadetBlue" />
    </ei:DataTrigger>
  </i:Interaction.Triggers>
  <Button.Template>
    <ControlTemplate TargetType="Button">
      <Border Background="{TemplateBinding Background}">
        <ContentPresenter />
      </Border>
    </ControlTemplate>
  </Button.Template>
</Button>

Обратите внимание, что фоновый триггер должен быть привязан к Background.Color; это не работает, если вы привязываетесь к самой кисти, возможно, потому, что SolidColorBrush не переопределяет Equals.

person Mike Strobel    schedule 30.10.2014
comment
Как это должно мне помочь? Это не приносит никакого эффекта. Кажется, что DataTrigger не может получить доступ к TemplatedParent, или если он это делает, он не может изменить элемент, в данном случае границу. - person Maximus; 30.10.2014
comment
Вы вообще не увидите фон, если не укажете его в своем шаблоне. Если вы не можете разрешить TemplatedParent, переместите i:Interaction.Triggers непосредственно под Button, а не в шаблон. - person Mike Strobel; 30.10.2014
comment
Я не хочу его видеть, а читать и исходя из его значения делать какие-то действия. Я вставил простой пример, но обычно я хочу прочитать, например, свойство IsEnabled и выполнить некоторые действия внутри шаблона. Основная проблема заключается в том, что я не могу получить доступ к родительскому шаблону с помощью взаимодействий. - person Maximus; 30.10.2014
comment
IsPressed работает, но попробуйте другие свойства, такие как Opacity, IsEnabled, AllowDrop и т. д., они не работают. - person Maximus; 30.10.2014
comment
Он отлично работает для IsEnabled, если вы установите его программным способом. Похоже, триггеры терпят неудачу только тогда, когда они соответствуют начальному состоянию кнопки. Даже фоновый триггер работает, если вы изменяете фон программно, хотя путь привязки должен быть Background.Color. Кажется, это побочный эффект объявления триггеров внутри шаблона. Если вы переместите триггеры до самого Button, все работает нормально (хотя вам нужно использовать ElementName вместо RelativeSource). - person Mike Strobel; 30.10.2014
comment
сначала я тоже думал, что это может быть равенство проверки {Binding Background...} против простой "Red" но на самом деле это работает по крайней мере для простой демки, которую я пробовал. Вы можете попробовать это сами, кнопка с некоторым фоном, установленным локально, DataTrigger (внутри его Style), прослушивающий Background, и сеттер, устанавливающий некоторые Foreground. - person King King; 30.10.2014
comment
@KingKing Вы тестировали в WPF или Silverlight? - person Mike Strobel; 30.10.2014
comment
ах, я проверил это в WPF, так что это не работает в Silverlight? действительно странно. - person King King; 30.10.2014
comment
Спасибо за ваши усилия, но в целом это не позволяет мне получить некоторую информацию от родителя и на ее основе выполнить некоторые действия, поэтому я получил конвертер следующим образом: Background={Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path= Непрозрачность, конвертер={StaticResource MyConverter}} - person Maximus; 31.10.2014