Проверка шаблонов данных для элементов в элементе управления - PullRequest
4 голосов
/ 28 июня 2011

У меня есть ItemsControl (скажем, ListBox), и у меня есть DataTemplate для содержимого.Когда я нажимаю кнопку, я хочу, чтобы все ListBoxItems были проверены.Это работает.

Тем не менее, хотя все элементы правильно проверены, и я могу получить для них сообщения об ошибках, WPF показывает только ValidationError.Template для SelectedItem рассматриваемого ListBox.Он не отображает ValidationError.Template для других элементов, которые не прошли проверку.Я обновляю источник привязки для каждого элемента, и для свойства Validation.HasError для них установлено значение true!Отсутствуют только визуальные эффекты, стиль не применяется!

У кого-нибудь есть решение проблемы?

Пример

Стиль TextBox:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                        <AdornedElementPlaceholder Name="MyAdorner" />
                </DockPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Setter Property="Background" Value="{DynamicResource TextBoxBackgroundBrush}" />
    <Style.Triggers>
        <Trigger Property="IsFocused" Value="true">
            <Setter Property="Background" Value="{DynamicResource TextBoxFocusBackgroundBrush}" />
        </Trigger>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="{DynamicResource ErrorBrush}" />
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>

</Style>

Шаблон данных для объекта Person:

<DataTemplate DataType="{x:Type entities:Person}" x:Key="PersonItemStyle">
    <Grid>
        <TextBox x:Name="SomeTextBox">
            <TextBox.Text>
               <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
                   <Binding.ValidationRules>
                            <validators:RequiredFieldValidationRule ErrorMessage="Please enter a name!" />
                   </Binding.ValidationRules/>
               </Binding>
            </TextBox.Text>
        </TextBox>
    </Grid>
</DataTemplate>

Где-то в каком-то элементе управления:

        <ListBox Grid.Row="1" x:Name="ListBoxPersons" Style="{DynamicResource ListBoxStyle}" ItemsSource="{Binding Path=Persons}" 
ItemContainerStyle="{StaticResource PersonItemStyle}">
        </ListBox>

Затем попробуйте изменить несколько человек, например, setих имена, чтобы обнулить или использовать любую ошибочную привязку.При проверке триггеры для Validation.HasError будут установлены только для выбранного элемента.

Как можно обойти эту проблему?

1 Ответ

0 голосов
/ 29 июля 2011

Вы устанавливаете ItemContainerStyle в DataTemplate, почему? Стиль применяется ко всем текстовым полям, поэтому вам не нужно устанавливать ItemContainerStyle отдельно.

...