Подтвердить что ты не робот

Использование TemplateBinding в ControlTemplate.Triggers

Почему следующий фрагмент XAML дает мне исключение XamlParseException с (бессмысленным) сообщением "Тип выражения не является допустимым значением стиля". во время выполнения?

<Control x:Class="TestApp.Max.MyControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:Max="clr-namespace:TestApp.Max"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300">
  <Control.Template>
    <ControlTemplate>
      <TextBlock Name="txt" Text="{TemplateBinding Max:MyControl.Foo}" />
      <ControlTemplate.Triggers>
        <Trigger Property="Control.IsMouseOver" Value="True">
          <Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" />
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </Control.Template>
</Control>

Строка оскорбления

<Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" />

Если я заменил TemplateBinding нормальным Binding, он начнет работать:

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text2}

Должен ли я использовать TemplateBinding, поскольку я нахожусь в ControlTemplate? И что действительно означает сообщение об исключении?

4b9b3361

Ответ 1

Связывание TemplatedParent: в этой строке значение path2 будет применяться к свойству Text для TextBlock, поэтому оно работает нормально.

В TemplateBinding: внимательно посмотрите на это. Разрешенное значение Max: MyControl.Bar будет действовать как ключ ресурса для привязки шаблона   [Здесь значение Bar не является фактическим значением, вместо этого оно является именем ключа свойства], которое не существует и поэтому оно выдает ошибку "данный ключ отсутствовал в словаре".

Ответ 2

Триггеры работают лучше, если они определены в автономных стилях, а не на месте. Попробуйте определить свой триггер в ресурсе стиля, а затем ссылайтесь на ресурс стиля из вашего шаблона.