验证itemscontrol中项目的数据模板

时间:2011-06-28 13:10:07

标签: c# .net wpf xaml itemscontrol

我有一个ItemsControl(让我们说一个ListBox),我有一个DataTemplate的内容。当我按下按钮时,我想要验证所有ListBoxItems。这有效。

然而,尽管所有项目都经过了适当的验证,并且我可以为它们检索错误消息,但WPF仅显示ValidationError.Template SelectedItem的{​​{1}}。对于验证失败的其他项目,它不显示ListBox。我确实更新了每个项目的绑定源,并且Validation.HasError属性设置为true!只是缺少视觉效果,风格没有被应用!

有没有人能解决这个问题?

示例

TextBox样式:

ValidationError.Template

人员实体的DataTemplate:

<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>

处于某种控制的某个地方:

<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>

然后尝试编辑一些人,例如将他们的名字设置为null或使用任何错误的绑定。验证时, <ListBox Grid.Row="1" x:Name="ListBoxPersons" Style="{DynamicResource ListBoxStyle}" ItemsSource="{Binding Path=Persons}" ItemContainerStyle="{StaticResource PersonItemStyle}"> </ListBox> 的触发器将仅为所选项目设置。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您正在将ItemContainerStyle设置为DataTemplate,为什么?该样式应用于所有文本框,因此您不必单独设置ItemContainerStyle。