Как проверить несколько свойств объекта, а затем применить стиль с всплывающей подсказкой к одному из элементов формы?

Это проект WPF/MVVM. Я использую блок приложения проверки MS Enterprise Library v5.0.

Требование состоит в том, что если значением поля со списком является «Удобства» или «Другое», то поле «Комментарий» должно иметь значение.

Тем не менее, я создал собственный валидатор и выполняю проверку следующим образом:

ValidationResults results = Validation.Validate<Annotation>(this.Annotation);

Существуют и другие возможности ошибок, и они покрываются стандартными атрибутами VAB.

Кажется, это работает нормально. Итак, теперь, если у меня есть условие ошибки, это может быть любое из правил, и у меня есть коллекция ValidationResults, доступная для опроса, чтобы определить, какое свойство имеет ошибку. Однако у меня возникают проблемы с применением стиля для определенного элемента, когда это происходит. В какой-то момент я использовал проверку на уровне свойств для данного элемента управления, но это не работает, когда мне нужно сравнить несколько свойств для одного правила проверки.

vab:Validate.BindingForProperty="Text"

Свойство выше и этот стиль работают для простой проверки одного свойства, такой как StringLenghtValidator. Это не работает в моем сценарии.

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">            
        <Setter Property="Background" Value="White"/>
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>

Как я могу заставить текстовое поле комментариев иметь определенный стиль после того, как пользовательский валидатор с несколькими свойствами сообщит об ошибке?


person chad    schedule 13.07.2012    source источник


Ответы (1)


Я использую корпоративную библиотеку с этим подходом, попробуйте

<ControlTemplate x:Key="ErrorMarkTemplate" TargetType="{x:Type Label}" >
    <TextBlock Text="*" Margin="2,0,2,0" VerticalAlignment="Center" HorizontalAlignment="Center" FontWeight="Bold" FontSize="16"  Foreground="{DynamicResource ErrorBrush}" /> 
</ControlTemplate>

 <ControlTemplate x:Key="GeneralErrorTemplate" >
        <Grid ClipToBounds="False" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="10" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Label Grid.Column="0" Template="{DynamicResource ErrorMarkTemplate}"  />
            <AdornedElementPlaceholder Grid.Column="1"  />
        </Grid  >
</ControlTemplate>


<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">     
        <Setter Property="Validation.ErrorTemplate" Value="{DynamicResource GeneralErrorTemplate}"/>
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding (Validation.Errors).CurrentItem.ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
    </Trigger>
    </Style.Triggers>
</Style>
person Xilmiki    schedule 12.08.2012