2012-03-07 10 views
2

MVVMを使用しているC#/ WPFのプロジェクトで作業しています。次のように私の問題を表現する 簡素化シナリオは次のとおりです。重複を避けるために、コレクション全体に対するコレクションアイテムの検証

タイプstringName性質を持っているPersonクラスは、あります。 HouseクラスはObservableCollectionPersonオブジェクト(Peopleと呼ばれます)を保持します。 HousePersonインスタンスには同じNameが含まれていないため、コレクションにPersonが追加されるたびにチェックが行われます。 WPFで

、Iは各Person(双方向)のNameに結合しているTextBoxを含むItemTemplateListBoxとを有しているので、ユーザはそれを変更することができます。

コレクション全体に対して検証を実行して、別のユーザーに既に名前が入力されているかどうかを確認する方法はありますか。

更新日:

だから私は、私は、引数としてコレクションを渡す必要があり、このためのカスタムValidationRuleを、使用しようとしています。実際、コレクションを保持するViewModel(DataContextListBox)と、検証が行われるPersonを渡す必要があります。

ので、thisポスト次、私はタイプPersonValidationContextの性質を持っているValidationRule由来MyValidationRuleオブジェクトを持っています。 PersonValidationContextクラスはFrameworkElementから派生し、2つのDependencyPropertyプロパティを持ちます.1つはViewModel用で、もう1つは現在のPerson用です。

挙げポストにH.B.によって応答として検証ルールは、ビジュアルツリーの一部ではないとして、ListBoxへの結合の回避策は、x:Referenceを使用することによってであろう。結局のところ私が持っているのは

だから、これはViewModelを渡すまでは機能します。ただし、Personバインディングは常にコレクションの最初のアイテム(つまり、最初のPerson)を指します。誰もこれについて何か知っていますか?選択したアイテムにバインドする方法に関する提案はありますか?

また、正しい動作を保証するために、誰かが更新されるたびに、すべての人物の検証を強制しようとしています(Person1の名前をPerson2と同じ名前に変更した場合、ユーザーがPerson2の名前を別のものに変更すると、エラーは消えません)。

どのポインタも大変ありがとうございます。

+0

'People'コレクションの他のメンバーが同じ名前を持つ場合、' Person'クラスは新しい 'Name'値を受け入れてはいけません。 'Person'か検証コードがそのコレクションに直接的または間接的にアクセスしない限り、要件を満たす方法はありません。カスタムの 'ValidationRule'は行く方法のようです。あなたが試したことの詳細と、それがうまくいかなかった理由を教えてください。サンプルコード?例外または誤った動作? – phoog

+0

はい、これも私が思ったことです。最新のサンプルコードについては、質問をご覧ください。 –

答えて

0

デザイン上のオブジェクトは、コレクションのメンバーであることを意識していません。コレクションへの参照が必要な場合は、それを渡す必要があります。しかし、親コレクションを渡すコンストラクタと親コンテナを持たないコンストラクタを持つことができます。親コレクションがnullの場合は、単に重複をチェックしないでください。

関連する問題