Подтвердить что ты не робот

Проблема при смешивании конвертера MultiBinding и триггера в стиле

Установка стиля в <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 для настройки свойств.

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

4b9b3361

Ответ 1

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