【问题标题】:WPF Binding Style.Trigger To ParentWPF 绑定 Style.Trigger 到父级
【发布时间】:2015-10-23 10:02:04
【问题描述】:

我正在尝试为我在网络上某处找到的 ComboBox 实施水印解决方案(我无法再次找到该页面),但绑定有问题。原始解决方案有静态文本,我想使用绑定到 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”部分似乎无法正常工作。 谁能告诉我为什么?

提前致谢!

【问题讨论】:

    标签: wpf xaml binding watermark


    【解决方案1】:

    恐怕没那么容易。

    首先,您不能像这样设置ComboxBox Background 属性。很明显,只要您尝试用一些硬编码文本替换 RelativeSource-Binding。

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

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

    会有一个名为“templateRoot”的Grid。添加您的水印资源:

    <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>...
    

    然后,您需要在&lt;ControlTemplate.Triggers&gt; 部分的末尾插入另一个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 条件,否则它是不可绑定的。

    【讨论】:

    • 我不明白你的第一点,因为如果我用一些硬编码的文本替换RelativeSource-Binding 它确实有效......?
    • 对我来说不是。如果这很重要,您应该发布一个完整的示例进行演示。
    • 哈哈,这很有趣。我创建了一个不显示水印的示例项目。在我添加 MahApps.Metro nuget 包并调整 App.xaml 中的样式后,它就可以工作了。他们必须以某种方式实现这种行为。不幸的是,我仍然无法将绑定映射到组合框的标记属性。无论如何,您可以在这里找到解决方案:dropbox.com/s/eb219vbqdo2co45/WpfApplication1.7z?dl=1
    • 我没有看到你在哪里尝试过我描述的 ControlTemplate。
    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2012-11-05
    • 2012-09-06
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多