【问题标题】:Using a TemplateBinding in ControlTemplate.Triggers在 ControlTemplate.Triggers 中使用 TemplateBinding
【发布时间】:2012-02-14 17:38:11
【问题描述】:

为什么下面的 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 中?异常消息的真正含义是什么?

【问题讨论】:

  • 我只是觉得我有类似的问题,完全忘记了能够使用常规绑定,感谢您的工作。

标签: .net wpf


【解决方案1】:

Binding TemplatedParent:在这一行中path2的值将应用于TextBlock的Text属性,所以它运行良好。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 抱歉,没有回答我的问题。我知道如何解决这个问题,但想知道它为什么会发生。
    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多