検証ルールを使用して、データグリッド セルに検証を実装しています。
セルの編集で検証が機能していますが、エラー メッセージとともにツールチップを表示する方法がありません。セル値が範囲外の場合にエラー アイコンが表示されますが、エラー メッセージのツールチップは表示されません。
これは 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);
}
}
この問題についての手がかりをありがとう。