WPF - MVVM:数据网格验证、工具提示错误消息不起作用

本文关键字:工具提示 错误 消息 不起作用 验证 网格 MVVM 数据 数据网 WPF | 更新日期: 2023-09-27 18:35:05

我正在通过验证规则对数据网格单元格进行验证。

我得到了对单元格编辑的验证,但无法显示带有错误消息的工具提示。当单元格值超出范围时,我收到错误图标,但没有收到错误消息工具提示。

这是 XAML 代码:

<UserControl.Resources>
    <local:DatagridViewModel x:Key="ViewModel"/>
    <CollectionViewSource x:Key="cvsEntries" Source="{Binding LineItems, Source={StaticResource ViewModel}}"/>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="ValidationErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <Image Source="../Images/error.png" ToolTip="{Binding  RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem}" Margin="0"  Width="15" Height="15" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<DataGrid x:Name="lineItemGrid" Grid.ColumnSpan="5" Grid.Row="13" Background="#FFD6E9F5" ItemsSource="{Binding Source={StaticResource cvsEntries}}" AutoGenerateColumns="False" CanUserDeleteRows="False" VerticalContentAlignment="Stretch" Margin="0,4,0,0" SelectionMode="Single"  SelectedItem="{Binding SelectedLineItem}">
    <DataGrid.Resources>
        <SolidColorBrush x:Key="DataGridDeployedTextForeground" Color="#FF409540"/>
        <SolidColorBrush x:Key="DataGridObsoleteTextForeground" Color="#FF934440"/>
        <SolidColorBrush x:Key="DataGridDraftTextForeground" Color="#FF654093"/>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn  Binding="{Binding Product, Mode=OneWay}" Header="Product" IsReadOnly="True"/>
        <DataGridTextColumn Binding="{Binding State, Mode=OneWay}" Header="State"   SortMemberPath="State" IsReadOnly="True"/>
        <DataGridTextColumn Header="Cust.Opt">
            <DataGridTextColumn.Binding>
                <Binding Path="CustomAttributeValue" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                            <local:PropertyValidation>
                            <local:PropertyValidation.ValidValue>
                                <local:ValueChecker
                                    Minimum="{Binding Path=CustomAttributeMinValue, Source={StaticResource cvsEntries}}"
                                    Maximum="{Binding Path=CustomAttributeMaxValue, Source={StaticResource cvsEntries}}"/>
                            </local:PropertyValidation.ValidValue>
                        </local:PropertyValidation>                                
                    </Binding.ValidationRules>
                </Binding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid> 

这是验证码:

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
  var result = new ValidationResult(true, null);
  var minValue = System.Convert.ToInt32(ValidValue.Minimum);
  var maxValue = System.Convert.ToInt32(ValidValue.Maximum);
  var valueToCheck = minValue;
  Error = "Error!!!";
  int.TryParse(value as string, out valueToCheck);
  CanBeValidated = true;
  if (minValue == -1 && maxValue == -1 && value == string.Empty)
  {
    value = null;
    CanBeValidated = false;
  }
  if (CanBeValidated == true && (valueToCheck < minValue || valueToCheck > maxValue))
  {
    result = new ValidationResult(false, this.Error);
  }
  else
  {
    result = new ValidationResult(true, "OK");
  }
  return result;
}

}

这是附加的属性:

public class ValueChecker : DependencyObject
{
    public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(string), typeof(ValueChecker));
    public string Minimum
    {
      get
      {
        return (string)GetValue(MinimumProperty);
      }
      set
      {
        SetValue(MinimumProperty, value);
      }
    }
    public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(string), typeof(ValueChecker));
    public string Maximum
    {
      get
      {
        return (string)GetValue(MaximumProperty);
      }
      set
      {
        SetValue(MaximumProperty, value);
      }
    }

感谢您提供有关此问题的任何线索。

WPF - MVVM:数据网格验证、工具提示错误消息不起作用

从验证中获取错误消息如下所示:

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

尝试一下,让我们知道它是否有效。 :)