Wpf 当DataGrid单元格无效时,如何消除红色边框?
我该怎么做?我想消除每个无效数据网格单元格上显示的恼人的红色边框。将单元格绑定的ValidateSondaErrors和ValidatesOnExpcetions设置为False。 如果需要验证,则必须覆盖控件的验证模板。请参考我的答案-Wpf 当DataGrid单元格无效时,如何消除红色边框?,wpf,Wpf,我该怎么做?我想消除每个无效数据网格单元格上显示的恼人的红色边框。将单元格绑定的ValidateSondaErrors和ValidatesOnExpcetions设置为False。 如果需要验证,则必须覆盖控件的验证模板。请参考我的答案- 我讨厌红色边框,因为它被放在装饰器中,装饰器位于窗口顶部,这意味着如果您的元素被另一个元素部分/完全隐藏(就像在网格中),则完整的装饰器仍然显示:( 但这并不意味着我不需要一些定制,所以我仍然可以用粉色突出显示我的项目,或者更改它们的前景,让DataGridC
我讨厌红色边框,因为它被放在装饰器中,装饰器位于窗口顶部,这意味着如果您的元素被另一个元素部分/完全隐藏(就像在网格中),则完整的装饰器仍然显示:( 但这并不意味着我不需要一些定制,所以我仍然可以用粉色突出显示我的项目,或者更改它们的前景,让DataGridCell正确地剪裁所有内容。你可以通过使用样式触发器来实现这一点 希望这有帮助
<DataGrid.Resources>
<Style TargetType="{x:Type TextBlock}" x:Key="TextBlockErrorStyle">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<!-- Just the adorned element means NO RED BORDER -->
<AdornedElementPlaceholder Name="controlWithError" />
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Background" Value="Pink"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
我也有同样的问题,但在我的例子中,我没有使用
IDataError
或INotifyDataErrorInfo
。我使用自定义的验证规则和样式来处理我的验证逻辑和表示。我已经在使用DataGridRowStyle
为有错误的行显示自定义样式,所以我认为用DataGridCell做类似的事情很容易
注意事项:
您不能只定义样式并设置DataGrid.CellStyle
。相反,您必须使用ElementStyle
和/或EditingElementStyle
样式TargetType
必须与单元格使用的DataGridColumn类型匹配。因此,对于DataGridComboBoxColumn,TargetType
应为ComboBox
DataGrid列XAML:
<DataGridComboBoxColumn Header="Column1"
ItemsSource="{Binding Path=Column1Path}"
DisplayMemberPath="Column1DisplayPath"
ElementStyle="{StaticResource DGComboColValidationStyle}"
EditingElementStyle="{StaticResource DGComboColValidationStyle}">
<DataGridComboBoxColumn.SelectedItemBinding>
<Binding Path="Column1Path" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<Validation:CustomValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</DataGridComboBoxColumn.SelectedItemBinding>
</DataGridComboBoxColumn>
样式定义
<Style x:Key="DGComboColValidationStyle" TargetType="{x:Type ComboBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Grid>
<Border BorderThickness="1"
BorderBrush="{Binding ElementName=adorner1, Path=DataContext[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}"
CornerRadius="3">
</Border>
<AdornedElementPlaceholder Name="adorner1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="DGTextColValidationStyle" TargetType="{x:Type TextBlock}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Grid>
<Border BorderThickness="1"
BorderBrush="{Binding ElementName=adorner2, Path=DataContext[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}"
CornerRadius="3">
</Border>
<AdornedElementPlaceholder Name="adorner2"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="DGRowValidationStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="ValidationErrorTemplate">
<Setter.Value>
<ControlTemplate x:Name="DGRowValidationTemplate">
<Grid>
<Ellipse Width="12" Height="12" Stroke="Black" StrokeThickness="0.5"
Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}"/>
<TextBlock FontWeight="Bold" Padding="4,0,0,0"
Margin="0" VerticalAlignment="Top" Foreground="White" Text="!"
ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent.ValidationMessage}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent.ValidationType, Converter={StaticResource ValidationTypeColorConverter}}"/>
</Trigger>
<Trigger Property="Validation.HasError" Value="false">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="Transparent" />
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="DGCellStyle" TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="false">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent.ValidationMessage}"/>
</Trigger>
</Style.Triggers>
</Style>
您也可以检查这一点
您只需将此行添加到数据网格:
<DataGrid Validation.ErrorTemplate="{x:Null}" />
我想让它验证数据。但我想更改默认的红色边框样式。红线不仅令人讨厌,而且它会应用于所有DataGridTemplateColumns,即使它们不是无效的,只是因为WPF调用了GetError(null)而不是GetError(绑定属性的名称)。谢谢,似乎覆盖了TextBlock的peropery“Validation.ErrorTemplate”完成这个技巧。我不知道控件有一个错误模板。
<DataGrid Validation.ErrorTemplate="{x:Null}" />