0

検証ルールを使用して、データグリッド セルに検証を実装しています。

セルの編集で検証が機能していますが、エラー メッセージとともにツールチップを表示する方法がありません。セル値が範囲外の場合にエラー アイコンが表示されますが、エラー メッセージのツールチップは表示されません。

これは 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);
      }
    }

この問題についての手がかりをありがとう。

4

1 に答える 1

0

検証からエラー メッセージを取得すると、次のようになります。

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

試してみて、うまくいったかどうかをお知らせください。:)

于 2013-10-13T20:59:57.907 に答える