Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF使用样式从嵌套元素中绑定到父属性_Wpf_Styles_Relativesource - Fatal编程技术网

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

WPF使用样式从嵌套元素中绑定到父属性,wpf,styles,relativesource,Wpf,Styles,Relativesource,我一直在尝试构建一个文本框,其中包含一个提示,该提示在文本框为空时显示。 我无法从样式中设置提示文本 准确地说,这是有效的(也就是说,它可以正确绑定): 但是,当我将其移动到样式时,它不会: <Style TargetType="TextBox" x:Key="stlHintbox"> <Style.Triggers> <DataTrigger Binding="{Binding Text, RelativeSource={Relativ

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

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


但是,当我将其移动到样式时,它不会:

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


有什么问题吗?如何从样式内绑定到祖先属性?

CreateSource无法按预期工作。 最好使用控件模板创建水印文本框。但您的版本可以工作:

<Window.Resources>
    <Style TargetType="TextBox" x:Key="stlHintbox">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
                <Setter Property="TextBox.Background">
                    <Setter.Value>
                        <VisualBrush Stretch="None" Visual="{Binding ElementName=hintText}"/>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <TextBox Tag="hint text" x:Name="myTextBox" Style="{StaticResource stlHintbox}" />
    <Border Visibility="Hidden">
        <TextBlock x:Name="hintText" Text="{Binding Tag, ElementName=myTextBox}" FontStyle="Italic" Foreground="LightGray" />
    </Border>
</StackPanel>

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

要了解这是一个问题的原因,请尝试一个思维实验:内部文本框创建一次(粗略地说,创建样式时会发生这种情况)。当您使用RelativeSource绑定时,应用样式的文本框中的哪一个应该被选择为内部文本框的祖先


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

这没关系,但它可以防止我在同一窗口中有多个hintbox,而且它的用法也不那么明显。谢谢你对控件模板的建议,我会更深入地研究它…好的,这真的很有意义。。。我看书看得太快了,好像:)
<Window.Resources>
    <Style TargetType="TextBox" x:Key="stlHintbox">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
                <Setter Property="TextBox.Background">
                    <Setter.Value>
                        <VisualBrush Stretch="None" Visual="{Binding ElementName=hintText}"/>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <TextBox Tag="hint text" x:Name="myTextBox" Style="{StaticResource stlHintbox}" />
    <Border Visibility="Hidden">
        <TextBlock x:Name="hintText" Text="{Binding Tag, ElementName=myTextBox}" FontStyle="Italic" Foreground="LightGray" />
    </Border>
</StackPanel>