4

データグリッド内の重複エントリを検証するために、UniqueNameSolidWoodRule という名前のサブクラス化された ValidationRule があります。

コードは次のとおりです。

public class UniqueNameSolidWoodRule : ValidationRule
{
    public CollectionViewSource CurrentCollection { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (value != null)
        {
            ObservableCollection<SolidWood_VM> castedCollection = (ObservableCollection<SolidWood_VM>)CurrentCollection.Source;

            foreach (SolidWood_VM swVM in castedCollection)
            {
                if (swVM.Designation == value.ToString())
                {
                    return new ValidationResult(false, ResourcesManager.Instance.GetString("DuplicatedRecord"));
                }
            }
        }

        return new ValidationResult(true, null);
    }
}

XAML スニペットは次のとおりです。

<DataGrid.Resources>
        <CollectionViewSource x:Key="CurrentSolidWoodCollection" Source="{Binding Path=SolidWoods}" />
</DataGrid.Resources>

 <DataGridTextColumn x:Name="Column2" Header="{x:Static p:Resources.Designation}" Width="auto">
        <DataGridTextColumn.Binding>
            <Binding Path="Designation" ValidatesOnDataErrors="True" UpdateSourceTrigger="LostFocus">
                 <Binding.ValidationRules>
                        <my:UniqueNameSolidWoodRule  CurrentCollection="{StaticResource CurrentSolidWoodCollection}"/>
                  </Binding.ValidationRules>
             </Binding>
         </DataGridTextColumn.Binding>
  </DataGridTextColumn>

私の問題は、このルールが値を独自の行と比較する場合があることです。どうすればこれを防ぐことができますか? 比較する値に関連付けられたrow.indexプロパティが必要なようですが、残念ながらこれを達成する方法がわかりません。

4

1 に答える 1

12

私はついに物事が機能するようになりました!

解決策は次のとおりです。

XAMLで、次のValidationStepを追加しました。

<my:UniqueNameSolidWoodRule CurrentCollection="{StaticResource CurrentSolidWoodCollection}" ValidationStep="CommittedValue"/>

このようにして、オーバーライドされたValidateメソッドの最初のパラメーターとして文字列ではなくBindingExpressionオブジェクトを取得します。これにより、同じオブジェクトを比較しているかどうかを確認するために使用できるHashCodeのように、検証するレコードに関するより多くの情報が得られます。 。

更新されたValidateメソッドは次のとおりです。

public class UniqueNameSolidWoodRule : ValidationRule
{
    public CollectionViewSource CurrentCollection { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (value != null)
        {
            ObservableCollection<SolidWood_VM> castedCollection = (ObservableCollection<SolidWood_VM>)CurrentCollection.Source;

            SolidWood_VM curValue = (SolidWood_VM)((BindingExpression)value).DataItem;

            foreach (SolidWood_VM swVM in castedCollection)
            {
                if (curValue.GetHashCode() != swVM.GetHashCode() && swVM.Designation == curValue.Designation.ToString())
                {
                    return new ValidationResult(false, ResourcesManager.Instance.GetString("DuplicatedRecord"));
                }
            }
        }

        return new ValidationResult(true, null);
    }
}
于 2012-05-11T16:56:20.360 に答える