简单的WPF IValueConverter和DataTrigger不能一起工作

时间:2009-11-30 20:33:28

标签: wpf datatrigger ivalueconverter

我在使用带数据触发器的值转换器时遇到了麻烦。在我的一些代码中,似乎DataTrigger的{​​{1}}被应用于根元素,而不是应用于样式的元素。

我创建了一个简单的测试用例,但我不了解它的行为。我希望Path变成红色或蓝色,具体取决于向Button的转换器输入的值,但DataTrigger根本没有受到影响!

Button

一个简单的转换器:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SimpleWpfApplication"
    x:Class="SimpleWpfApplication.SimpleUserControl"
    ToolTip="UserControl ToolTip">
    <UserControl.Resources>
        <local:SimpleConverter x:Key="SimpleConverter" />
    </UserControl.Resources>
    <Button ToolTip="Button ToolTip">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Style.Triggers>
                    <DataTrigger
                        Binding="{Binding Path=ToolTip, Converter={StaticResource SimpleConverter}}"
                        Value="Button ToolTip">
                        <Setter Property="Background" Value="Red" />
                    </DataTrigger>
                    <DataTrigger
                        Binding="{Binding Path=ToolTip, Converter={StaticResource SimpleConverter}}"
                        Value="UserControl ToolTip">
                        <Setter Property="Background" Value="Blue" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</UserControl>

为什么不调用class SimpleConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new InvalidOperationException("SimpleConverter is a OneWay converter."); } } ?为什么Convert不变为红色或蓝色?

1 个答案:

答案 0 :(得分:8)

在另一个StackOverflow问题中找到答案:What’s wrong with my datatrigger binding?

答案是将RelativeSource={RelativeSource Self}添加到绑定中:

<DataTrigger Binding="{Binding Path=ToolTip,
                       RelativeSource={RelativeSource Self},
                       Converter={StaticResource SimpleConverter}}" />