12

设置样式<UserControl.Resources>(假设转换器返回红色)

<Style x:Key="FieldToValidate" TargetType="{x:Type TextBox}">
    <Setter Property="Background">
        <Setter.Value>
            <MultiBinding Converter="{StaticResource VisualQueueOnErrorConverter}">
                <Binding RelativeSource="{RelativeSource self}" Path="Name" />
                <Binding RelativeSource="{RelativeSource AncestorType={x:Type DockPanel}}" Path="DataContext.ErrorFieldName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
            </MultiBinding>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="Background" Value="Red">
            <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource self}}" />
            <Setter Property="Foreground" Value="White" />
        </Trigger>
    </Style.Triggers>
</Style>

和控制:

<TextBox  Name="FirstName" Text="{Binding FirstName}" Style="{StaticResource FieldToValidate}">  

预期结果是FirstName当 MultiBinding 转换器将背景颜色更改为红色时,字段获得焦点并且前景色更改为白色,但是,当字段的背景更改为红色时,它既没有获得焦点,也没有新的前景色.

XAML 解析器似乎在属性设置器的 MultiBinding 转换器之前处理触发器。

欢迎任何和所有建议!

4

1 回答 1

25

我认为Red触发器中指定的Red画笔和转换器返回的画笔不相等(因为它们是不同的实例),因此触发器永远不会执行。无论如何,依靠背景颜色来触发某些东西似乎不是一个很好的主意……

您应该更改您的转换器,以便在发生错误时返回 true,并按如下方式使用它:

<Style x:Key="FieldToValidate" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <DataTrigger Value="True">
            <DataTrigger.Binding>
                <MultiBinding Converter="{StaticResource VisualQueueOnErrorConverter}">
                    <Binding RelativeSource="{RelativeSource self}" Path="Name" />
                    <Binding RelativeSource="{RelativeSource AncestorType={x:Type DockPanel}}" Path="DataContext.ErrorFieldName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" />
                </MultiBinding>
            </DataTrigger.Binding>
            <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource self}}" />
            <Setter Property="Background" Value="Red" />
            <Setter Property="Foreground" Value="White" />
        </DataTrigger>
    </Style.Triggers>
</Style>

此外,以您的转换器的名义,您的意思可能是“视觉提示”,而不是“队列”;)

于 2011-05-05T19:00:19.017 回答