在ControlTemplate.Triggers中使用TemplatedParent Binding

3

当文本为空时,我试图使用ControlTemplate中的触发器将自定义控件的背景设置为Visual Brush。以下是相关代码:

<ControlTemplate.Triggers>
  <Trigger Property="Text" Value="">
    <Setter TargetName="MyBorder" Property="Background">
      <Setter.Value>
        <VisualBrush Opacity="0.4" Stretch="None" TileMode="None">
          <VisualBrush.Visual>
            <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BackgroundText}" />
          </VisualBrush.Visual>
        </VisualBrush>
      </Setter.Value>
    </Setter>
  </Trigger>
</ControlTemplate.Triggers>

当文本为空时,视觉画刷不会生效。但是,如果我在代码中创建视觉画刷并将其公开为依赖属性,则以下代码可以生效:

<ControlTemplate.Triggers>
  <Trigger Property="Text" Value="">
    <Setter TargetName="MyBorder" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BackgroundBrush}" />
    </Setter>
  </Trigger>
</ControlTemplate.Triggers>

虽然我更喜欢在XAML中定义笔刷,但为什么第一个绑定不正确而第二个绑定却正常工作呢?

1个回答

1
你想创建一个水印文本框吗?如果是这样,我通过在自定义控件中添加 TextBlock,并在触发定义中引用它来创建自己的文本框。当 TextBox 没有焦点,且控件中没有文本时,水印(TextBlock)将可见。一旦 TexBox 获得焦点,水印将被隐藏。然后,水印的文本将绑定到你的 BackgroundText 属性上。
<ControlTemplate.Triggers>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsFocused" Value="false"/>
            <Condition Property="Text" Value="{x:Null}"/>
        </MultiTrigger.Conditions>
        <Setter TargetName="Watermark" Property="Visibility" Value="Visible"/>
    </MultiTrigger>
    <MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="IsFocused" Value="false"/>
            <Condition Property="Text" Value=""/>
        </MultiTrigger.Conditions>
        <Setter TargetName="Watermark" Property="Visibility" Value="Visible"/>
    </MultiTrigger>
</ControlTemplate.Triggers>

1
感谢您的回答,Brent。是的,这正是我想要实现的,我已经看到了一个类似于您的方法可以实现。然而,我真正想找到的答案是为什么绑定行为在这两种情况下会发生变化,而不是如何完成特定任务。如果没有表达清楚,那我很抱歉。 - Tarsier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接