为什么这个简单的WPF绑定不起作用?

时间:2012-06-08 14:26:12

标签: wpf binding

我有一个绑定到过滤后的DataView的按钮(总是1条记录):

<Button x:Name="btnValidate" Grid.Row="0" Grid.RowSpan="2" Grid.Column="3" Cursor="Hand" Click="btnValidate_Click">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="{StaticResource ValidationNoneBrush}" />
            <Setter Property="Tag" Value="{Binding VALIDATED, Converter={StaticResource DebugConverter}}" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border x:Name="bdrValidate" Background="{TemplateBinding Background}">
                            <Image Source="../Images/24/LocationSearch.png" Stretch="None" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="Tag" Value="1">
                    <Setter Property="Background" Value="Blue"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

正如您所看到的,我有一个用于调试的转换器,它工作正常。我看到通过转换器的值是0和1。那么为什么背景不会根据样式触发器而改变?我无法弄明白......

2 个答案:

答案 0 :(得分:1)

大概你的转换器返回整数0或整数1? Tag属性的类型为Object,因此XAML编译器假定触发器中的“1”值为string,而不是int

更改转换器以返回string,或在触发器中指定int值:

<Trigger xmlns:sys="clr-namespace:System;assembly=mscorlib" Property="Tag">
    <Trigger.Value>
        <sys:Int32>1</sys:Int32>
    </Trigger.Value>
</Trigger>

答案 1 :(得分:0)

我认为您的问题是,由于Tag属于对象类型,因此1个值被视为字符串,以防您的属性VALIDATED为int。

正如msdn所述,Trigger.Value会进行reference equality检查。 Object.ReferenceEquals("1", 1)是假的。

如果您将VALIDATED属性修改为字符串,则它应该可以正常工作。