WPF绑定Style.Trigger到Parent

时间:2015-10-23 10:02:05

标签: wpf xaml binding watermark

我正在尝试为我的ComboBox实现一个Watermark解决方案我在网上找到了某个地方(我再也找不到该页面),但是绑定有问题。原始解决方案有静态文本,我想使用绑定到ComboBoxes Tag属性来替换它。

这是我到目前为止所做的:

 <Grid>
        <Grid.Resources>
            <VisualBrush x:Key="Watermark" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left">
                <VisualBrush.Visual>
                    <TextBlock FontStyle="Italic" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=Tag}"/>
                </VisualBrush.Visual>
            </VisualBrush>
            <Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
                <Setter Property="Margin" Value="5"/>
                <Setter Property="IsEditable" Value="False"/>
                <Setter Property="IsReadOnly" Value="True"/>
                <Style.Triggers>
                    <Trigger Property="Text" Value="">
                        <Setter Property="Background" Value="{DynamicResource Watermark}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <ComboBox Grid.Column="0" ItemsSource="{Binding Categories}" Tag="Categories"/>
        <ComboBox Grid.Column="1" ItemsSource="{Binding SubCategories}" Tag="SubCategories"/>
        <ComboBox Grid.Column="2" ItemsSource="{Binding Whatever}" Tag="Whatever"/>

不幸的是,看起来“FindAncestor”部分无效。 谁能告诉我为什么?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我担心这并不容易。

首先,您无法像这样设置ComboxBox Background属性。一旦你尝试用一些硬编码文本替换RelativeSource-Binding,就会很明显。

其次,您必须确保VisualBrush资源是ComboBox的VisualTree的一部分,而不是其他地方(例如,在包含Grid中)。

重新模仿ComboBox可以解决这两个问题。这可以通过首先创建新模板(作为副本)在Blend或Visual Studio中完成。然后你需要改变它。

将会有Grid名为&#34; templateRoot&#34;。添加水印资源:

<Grid x:Name="templateRoot" SnapsToDevicePixels="True">
    <Grid.Resources>
        <VisualBrush x:Key="Watermark" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left">
            <VisualBrush.Visual>
                <TextBlock FontStyle="Italic" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=Tag}"/>
            </VisualBrush.Visual>
        </VisualBrush>
    </Grid.Resources>
    <Grid.ColumnDefinitions>...

然后,在<ControlTemplate.Triggers>部分的末尾,您需要插入另一个MultiDataTrigger

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="" />
    </MultiDataTrigger.Conditions>
    <Setter Property="Background" TargetName="templateRoot" Value="{DynamicResource Watermark}"/>
</MultiDataTrigger>

必须是MultiTrigger条件,否则它不可绑定。