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

M. *_*ley 3 wpf datatrigger ivalueconverter

我一直在使用带数据触发器的值转换器时遇到问题.在我的一些代码,它似乎像DataTriggerPath被应用到根元素,而不是风格适用于哪些元素.

我创建了一个简单的测试用例,我不明白它的行为.我希望它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>
Run Code Online (Sandbox Code Playgroud)

一个简单的转换器:

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么不Convert被召唤?为什么不Button转红色或蓝色?

M. *_*ley 8

在另一个StackOverflow问题中找到答案:我的datatrigger绑定有什么问题?

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

<DataTrigger Binding="{Binding Path=ToolTip,
                       RelativeSource={RelativeSource Self},
                       Converter={StaticResource SimpleConverter}}" />
Run Code Online (Sandbox Code Playgroud)