Проблема при смешивании конвертера MultiBinding и триггера в стиле - PullRequest
12 голосов
/ 05 мая 2011

Установка стиля в <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 обрабатывает Trigger до конвертера MultiBinding установщика свойств.

Любые предложения приветствуются!

1 Ответ

25 голосов
/ 05 мая 2011

Я думаю, что кисть 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>

Кроме того, в названии вашего конвертера вы, вероятно, имели в виду «visual cue », а не « queue» ;)

...