WPF 列表框错误模板
WPF ListBox ErrorTemplate
在我的 WPF 应用程序中,我有一个绑定到视图模型集合的 ListBox。
这些视图模型支持通过实现 INotifyDataErrorInfo 进行验证。
我正在尝试为我的 ListBox 中存在验证错误的项目显示一个错误模板。
我可以通过在 ListBox 的 ItemSource 绑定上设置 NotifyOnValidationError=True 让 ListBox 显示默认错误模板。
看起来像这样:
我的列表框代码:
<ListBox x:Name="ListBoxEvents" ItemsSource="{Binding Events, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}"
IsSynchronizedWithCurrentItem="True" ItemTemplate="{DynamicResource EventListTemplate}"></ListBox>
我的列表框样式:
<ControlTemplate x:Key="ListBoxValidationError">
<DockPanel LastChildFill="True">
<Border Background="Red" Margin="5">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
<Style TargetType="{x:Type ListBox}">
<Setter Property="BorderBrush" Value="{StaticResource WindowTitleBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="MinWidth" Value="200" />
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
<Setter Property="ScrollViewer.CanContentScroll" Value="False"></Setter>
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource ListBoxValidationError}"></Setter>
</Style>
ListBox 项模板:
<DataTemplate x:Key="EventListTemplate" DataType="{x:Type event:EventViewModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding Title, Converter={StaticResource EmptyStringConverter}, ConverterParameter='-'}" FontWeight="Bold" FontSize="14" />
<TextBlock Text="{Binding Date, StringFormat={}{0:dd.MM.yyyy}}" Grid.Row="1" Grid.Column="0" FontStyle="Italic" />
<Button Grid.Column="1" Grid.RowSpan="2" Grid.Row="0" Style="{DynamicResource ItemDeleteButton}" />
</Grid>
</DataTemplate>
如何为我的 ListBoxItems 显示自定义错误模板?
(我的目标是让物品的背景变成红色)
您可以在 ListBoxItem 上指定 Valdiation.ErrorTemplate
,也可以在 ItemContainerStyle
中指定:
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border Background="Red" Opacity="0.2">
<AdornedElementPlaceholder/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
当项目中的任何 属性 抛出错误时,您很可能希望在 ListBoxItem 上显示它。说 Name 属性 in ListBoxItem data is invalid which is bind to TextBox.在文本框上将 ValidatesOnDataErrors
设置为 true,并将 Validation.ValidationAdornerSite
设置为父 ListBoxItem。
示例:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Validation.ValidationAdornerSite="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border Background="Red" Opacity="0.2">
<AdornedElementPlaceholder/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
在我的 WPF 应用程序中,我有一个绑定到视图模型集合的 ListBox。 这些视图模型支持通过实现 INotifyDataErrorInfo 进行验证。 我正在尝试为我的 ListBox 中存在验证错误的项目显示一个错误模板。
我可以通过在 ListBox 的 ItemSource 绑定上设置 NotifyOnValidationError=True 让 ListBox 显示默认错误模板。
看起来像这样:
我的列表框代码:
<ListBox x:Name="ListBoxEvents" ItemsSource="{Binding Events, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}"
IsSynchronizedWithCurrentItem="True" ItemTemplate="{DynamicResource EventListTemplate}"></ListBox>
我的列表框样式:
<ControlTemplate x:Key="ListBoxValidationError">
<DockPanel LastChildFill="True">
<Border Background="Red" Margin="5">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
<Style TargetType="{x:Type ListBox}">
<Setter Property="BorderBrush" Value="{StaticResource WindowTitleBrush}" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="MinWidth" Value="200" />
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
<Setter Property="ScrollViewer.CanContentScroll" Value="False"></Setter>
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource ListBoxValidationError}"></Setter>
</Style>
ListBox 项模板:
<DataTemplate x:Key="EventListTemplate" DataType="{x:Type event:EventViewModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding Title, Converter={StaticResource EmptyStringConverter}, ConverterParameter='-'}" FontWeight="Bold" FontSize="14" />
<TextBlock Text="{Binding Date, StringFormat={}{0:dd.MM.yyyy}}" Grid.Row="1" Grid.Column="0" FontStyle="Italic" />
<Button Grid.Column="1" Grid.RowSpan="2" Grid.Row="0" Style="{DynamicResource ItemDeleteButton}" />
</Grid>
</DataTemplate>
如何为我的 ListBoxItems 显示自定义错误模板? (我的目标是让物品的背景变成红色)
您可以在 ListBoxItem 上指定 Valdiation.ErrorTemplate
,也可以在 ItemContainerStyle
中指定:
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border Background="Red" Opacity="0.2">
<AdornedElementPlaceholder/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
当项目中的任何 属性 抛出错误时,您很可能希望在 ListBoxItem 上显示它。说 Name 属性 in ListBoxItem data is invalid which is bind to TextBox.在文本框上将 ValidatesOnDataErrors
设置为 true,并将 Validation.ValidationAdornerSite
设置为父 ListBoxItem。
示例:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Validation.ValidationAdornerSite="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border Background="Red" Opacity="0.2">
<AdornedElementPlaceholder/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>