我有一个 DataGrid,我使用 . 验证每个单元格的用户输入IDataErrorInfo
。当用户输入无效数据时,会为每个单元格显示相应的错误消息。
当我将 ValidationErrorTemplate (controltemplate) 悬停在网格行的左侧时,如何收集和显示所有行的单元格错误消息?
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontFamily" Value="ArialMT"/>
<Setter Property="Height" Value="24"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="ValidationErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Grid>
<Ellipse Width="12" Height="12" Fill="Red" Stroke="Black" StrokeThickness="0.5"/>
<TextBlock FontWeight="Bold" Padding="4,0,0,0" Margin="0" VerticalAlignment="Top" Foreground="White" Text="!" />
<!--<ToolTip {Binding RelativeSource={RelativeSourceSelf}, Path=(Validation.Errors)[0].ErrorContent}"/>-->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<!--<DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}}" Value="true" >-->
<!--<DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="true" >-->
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="IsEnabled" Value="True" />
</Trigger>
<Trigger Property="Validation.HasError" Value="false">
<!--<DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}}" Value="false" >-->
<!--<DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="false" >-->
<Setter Property="ToolTip" Value="{x:Null}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="IsEnabled" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
2019-01-25 更新: 我的风格定义了错误的单元格:
<Style x:Key="textBlockErrStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="false" >
<Setter Property="ToolTip" Value="{x:Null}"/>
</DataTrigger>
<DataTrigger Binding="{Binding (Validation.HasError), RelativeSource={RelativeSource Self}}" Value="true" >
<Setter Property="Background" Value="Red" />
<Setter Property="Foreground" Value="White" />
<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
<!--<Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=RawTag.ErrorList, Converter={StaticResource conv:StringToListConverter}}"/>-->
</DataTrigger>
</Style.Triggers>
</Style>
2019-02-18 更新:
--> 红色边框仍在该行周围,该行左侧的警告标志仍然可见。
我也试过这个:
public void RemoveError(string propertyName, bool notify = true)
{
if (ErrorList.ContainsKey(propertyName))
{
ErrorList.Remove(propertyName);
HasErrors = ErrorList.Count > 0;
//NotifyErrorsChanged(propertyName);
OnPropertyChanged(propertyName);
OnPropertyChanged("GetAllErrors");
}
if (notify) ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
}
...尽管我OnPropertyChange
在模型类的每个设置器中都使用了。错误列表为空,但边框和警告符号保留。
2019-02-19 更新:
我对 INotfiyPropertyChanged 接口的实现:
#region INotifyPropertyChanged
/// <summary>
/// Handler to register for property changed event
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Method to invoke the property change event
/// </summary>
/// <param name="propertyName">The name of the changed property</param>
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion