将触发器值绑定到属性

4
我正在尝试设置一个触发器,当两个值匹配时会发生颜色变化。如果要匹配的对象是静态的并且可以直接放在XAML中,则很容易实现,但如果要比较的对象是动态的,例如属性,则不容易实现。基本上,有没有办法将触发器的值绑定到属性上呢?
例如,错误提示说值不能使用绑定。这让我想到该值必须是静态的。
<TextBlock Name="MyTextBlock" Text="{Binding someProp}">
    <TextBlock.Resources>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=MyTextBlock, Path=Text}" Value="{Binding someOtherProperty}">
                    Do some stuff here
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Resources>
</Textblock>

编辑:已更新为数据触发器,但问题仍然存在。


请注意,评论中的OP已经有效地同意这是https://dev59.com/AHE95IYBdhLWcg3wmvGh的重复。 - StayOnTarget
1个回答

4
为此,您可以使用DataTriggers,如下例所示(TextBlock命名为txtBlock的颜色变化取决于值“R”或“N”):
<Style.Triggers>
    <DataTrigger Binding="{Binding ElementName=txtBlock,Path=Text}" Value="R">
            <Setter Property="Background" Value="#f9f9f9" />
            <Setter Property="Foreground" Value="Red" />
    </DataTrigger>
    <DataTrigger Binding="{Binding ElementName=txtBlock,Path=Text}" Value="N">
        <Setter Property="Background" Value="Yellow" />
        <Setter Property="Foreground" Value="Black" />
    </DataTrigger>
</Style.Triggers>

该解决方案适用于在条件中使用的任何有限数据集。对于更复杂的条件(例如,在条件块中使用的变量等),您可以像示例中所示在代码后端实现值转换器和绑定:在WPF DataTrigger值中进行绑定。此外,您可以考虑使用MultiDataTrigger或带有MultiBindingDataTrigger(参见MultiDataTrigger vs DataTrigger with multibinding)。希望这可以帮到您。

这将比较txtBlock.Text和值,我的问题是该值不是静态的。 - Jacob McCarthy
我已经扩展了答案(我猜,你所说的“静态”是指const,所以你的问题是关于在datatrigger中使用变量)。此致敬礼。 - Alexander Bell
1
多绑定的数据触发器正是我所需要的。谢谢。 - Jacob McCarthy

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