我有一个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>
的触发器将仅为所选项目设置。
如何解决这个问题?
答案 0 :(得分:0)
您正在将ItemContainerStyle设置为DataTemplate,为什么?该样式应用于所有文本框,因此您不必单独设置ItemContainerStyle。