在ControlTemplate.Triggers中使用TemplateBinding

时间:2012-02-14 17:38:12

标签: .net wpf

为什么下面的XAML给我一个带有(无意义)消息的XamlParseException"表达式类型不是有效的Style值。"在运行时?

<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}" />

如果我用普通的Binding替换TemplateBinding,它就会开始工作:

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

我不能使用TemplateBinding因为我在ControlTemplate中吗?异常消息到底意味着什么?

2 个答案:

答案 0 :(得分:2)

绑定TemplatedParent:在这一行中,path2的值将适用于TextBlock的Text属性,因此运行正常。

在TemplateBinding中:仔细看看,Max:MyControl.Bar的解析值将作为Template绑定的资源键     [这里Bar的值不是实际值,而是一个属性键名称],它不存在,因此它会抛出错误“给定的键不存在于字典中”。

答案 1 :(得分:1)

在独立样式中定义触发器时效果最佳,而不是就地内容。尝试在样式资源中定义触发器,然后从模板中引用样式资源。