2008-08-29 7 views
1

特定のプロパティが特定のコレクションのコンテキスト内で一意であることを強制するカスタムWPF ValidationRuleを作成しようとしています。たとえば、ListViewにバインドされたカスタムオブジェクトのコレクションを編集しています。コレクション内の各オブジェクトのNameプロパティが一意であることを確認する必要があります。誰もこれを行う方法を知っていますか?プロパティを作成し、あなたのValidationRuleから派生したクラスで、その後ValidationRule一意の名前を適用するには

class YourCollectionType : DependencyObject { 

    [PROPERTY DEPENDENCY OF ObservableCollection<YourType> NAMED: BoundList] 

} 

答えて

2

まず、私はあなたのコレクションを保持するために簡単なのDependencyObjectクラスを作成したい

YourCollectionType ListToCheck { get; set; } 

その後、中XAMLの場合:

<Binding.ValidationRules> 
    <YourValidationRule> 
     <YourValidationRule.ListToCheck>  
      <YourCollectionType BoundList="{Binding Path=TheCollectionYouWantToCheck}" /> 
     </YourValidationRule.ListToCheck> 
    </YourValidationRule> 
</Binding.ValidationRules> 

次に、ListToCheckのBoundListプロパティのcollあなたが妥当性を確認しているアイテムのためのアクション。それがそこにあれば、明らかに誤った検証結果を返す。そうでない場合はtrueを返します。

+1

をこれは、あなたが正しい –

+0

(のDataContextを継承していないようだ)結合結果は常にnullで、動作するようには思えません。 ValidationRuleはビジュアルツリーの一部ではないため、DataContextを継承しません。問題とその解決方法を説明している素敵な記事があります。[こちら](http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx)、[ここ](http://www.codeproject.com/KB/) WPF/ArtificialInheritanceCxt.aspx)。 –

0

ルールにバインドする他のプロパティがある場合にのみ、カスタム依存オブジェクトを作成します。この場合、チェックする値のコレクションを1つ追加するだけで、<UniqueValueValidationRule.OtherValues>プロパティは<CollectionContainer>になりました。継承されていないDataContextの問題を乗り越えるためにそこから

、実際の結合を保持し、それをOtherValuesが、その後のような結合のソースを使用することができ{StaticResource}キーを、与えるために<CollectionViewSource>を持つことが必要<TextBox.Resources>

妥当性検査のルールそのものは、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> 
関連する問題