WPF - MVVM:Datagrid 验证,工具提示 wrih 错误消息不起作用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19346191/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 09:50:34  来源:igfitidea点击:

WPF - MVVM : Datagrid validation, Tooltip wrih error message don't work

c#wpfvalidationmvvmdatagrid

提问by Pietro

I'm implementing validation on datagrid cells through validation rules.

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

I get the validation working on the cell editing, but no way to display a tooltip with the error message. I get the error Icon when the cell value is out of range, but not the error message tooltip.

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

This is the XAML code:

这是 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> 

and this is the validation code:

这是验证代码:

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;
}

}

}

and this the attached properties:

这是附加的属性:

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);
      }
    }

Thanks for any clue on this issue.

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

回答by dev hedgehog

Getting error message out of validation looks like this:

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

<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>

Try it out and let us know if it worked. :)

试试看,让我们知道它是否有效。:)