gpt4 book ai didi

WPF 使用样式从嵌套元素中绑定(bind)到父属性

转载 作者:行者123 更新时间:2023-12-03 20:28:17 26 4
gpt4 key购买 nike

我一直在尝试构建一个带有提示的文本框,该提示在它为空时显示。
我无法从样式中设置提示文本。

准确地说,这是有效的(也就是说,它正确绑定(bind)):

    <TextBox Tag="hint text">
<TextBox.Background>
<VisualBrush Stretch="None">
<VisualBrush.Visual>
<TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" />
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Background>
</TextBox>

但是,当我将它移到样式时,它不会:
<Style TargetType="TextBox" x:Key="stlHintbox">
<Style.Triggers>
<DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
<Setter Property="Background">
<Setter.Value>
<VisualBrush Stretch="None">
<VisualBrush.Visual>
<TextBlock Tag="inner" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}"
FontStyle="Italic" Foreground="LightGray" />
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>

<TextBox Tag="hint text" Style="{StaticResource stlHintbox}" />

那么有什么问题呢?如何从样式中绑定(bind)到祖先属性?

最佳答案

问题不在于RelativeSource,而在于您使用VisualBrush 的方式。回想一下,样式在您应用它们的元素之间共享。您的示例不起作用的原因是,实际上您正在尝试与多个父文本框共享单个文本框(您标记为“内部”的文本框)。

要了解为什么这是一个问题,请尝试一个思想实验:内部文本框被创建一次(粗略地说,这将在创建样式时发生)。当您使用RelativeSource 绑定(bind)时,应该选择应用样式的哪个文本框作为内部文本框的祖先?

这就是为什么DataTemplatesControlTemplates存在于 WPF 中。他们没有直接实际实例化视觉效果,而是定义了一个模板,允许根据需要创建多个视觉效果副本。

关于WPF 使用样式从嵌套元素中绑定(bind)到父属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com