特定のプロパティが特定のコレクションのコンテキスト内で一意であることを強制するために、カスタムWPFValidationRuleを作成しようとしています。例:ListViewにバインドされたカスタムオブジェクトのコレクションを編集していて、コレクション内の各オブジェクトのNameプロパティが一意であることを確認する必要があります。誰かがこれを行う方法を知っていますか?
2 に答える
まず、コレクションを保持する単純な DependencyObject クラスを作成します。
class YourCollectionType : DependencyObject {
[PROPERTY DEPENDENCY OF ObservableCollection<YourType> NAMED: BoundList]
}
次に、ValidationRule 派生クラスで、プロパティを作成します。
YourCollectionType ListToCheck { get; set; }
次に、XAML で次のようにします。
<Binding.ValidationRules>
<YourValidationRule>
<YourValidationRule.ListToCheck>
<YourCollectionType BoundList="{Binding Path=TheCollectionYouWantToCheck}" />
</YourValidationRule.ListToCheck>
</YourValidationRule>
</Binding.ValidationRules>
次に、検証で、検証対象のアイテムの ListToCheck の BoundList プロパティのコレクションを調べます。そこにある場合は、明らかに偽の検証結果を返します。そうでない場合は、true を返します。
ルールにバインドしたい他のプロパティがある場合にのみ、カスタム依存オブジェクトを作成します。この場合、チェックする値の単一のコレクションをアタッチするだけなので、<UniqueValueValidationRule.OtherValues>
プロパティを a にしました<CollectionContainer>
。
そこから、DataContext
が継承されないという問題を回避するには、実際のバインディングを保持し、バインディング ソースとして使用できるキーを与える<TextBox.Resources>
必要がありました。<CollectionViewSource>
{StaticResource}
OtherValues
OtherValues.Collection
検証ルール自体は、ループして等値チェックを実行するだけで済みます。
観察:
<TextBox>
<TextBox.Resources>
<CollectionViewSource x:Key="otherNames" Source="{Binding OtherNames}"/>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="Name">
<Binding.ValidationRules>
<t:UniqueValueValidationRule>
<t:UniqueValueValidationRule.OtherValues>
<CollectionContainer Collection="{Binding Source={StaticResource otherNames}}"/>
</t:UniqueValueValidationRule.OtherValues>
</t:UniqueValueValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>