MVVMを使用しているC#/ WPFのプロジェクトで作業しています。次のように私の問題を表現する 簡素化シナリオは次のとおりです。重複を避けるために、コレクション全体に対するコレクションアイテムの検証
タイプstring
のName
性質を持っているPerson
クラスは、あります。 House
クラスはObservableCollection
のPerson
オブジェクト(People
と呼ばれます)を保持します。 House
のPerson
インスタンスには同じName
が含まれていないため、コレクションにPerson
が追加されるたびにチェックが行われます。 WPFで
、Iは各Person
(双方向)のName
に結合しているTextBox
を含むItemTemplate
ListBox
とを有しているので、ユーザはそれを変更することができます。
コレクション全体に対して検証を実行して、別のユーザーに既に名前が入力されているかどうかを確認する方法はありますか。
更新日:
だから私は、私は、引数としてコレクションを渡す必要があり、このためのカスタムValidationRule
を、使用しようとしています。実際、コレクションを保持するViewModel(DataContext
はListBox
)と、検証が行われるPerson
を渡す必要があります。
ので、thisポスト次、私はタイプPersonValidationContext
の性質を持っているValidationRule
由来MyValidationRule
オブジェクトを持っています。 PersonValidationContext
クラスはFrameworkElement
から派生し、2つのDependencyProperty
プロパティを持ちます.1つはViewModel用で、もう1つは現在のPerson用です。
挙げポストにH.B.によって応答として検証ルールは、ビジュアルツリーの一部ではないとして、ListBox
への結合の回避策は、x:Reference
を使用することによってであろう。結局のところ私が持っているのは
だから、これはViewModelを渡すまでは機能します。ただし、Person
バインディングは常にコレクションの最初のアイテム(つまり、最初のPerson
)を指します。誰もこれについて何か知っていますか?選択したアイテムにバインドする方法に関する提案はありますか?
また、正しい動作を保証するために、誰かが更新されるたびに、すべての人物の検証を強制しようとしています(Person1の名前をPerson2と同じ名前に変更した場合、ユーザーがPerson2の名前を別のものに変更すると、エラーは消えません)。
どのポインタも大変ありがとうございます。
'People'コレクションの他のメンバーが同じ名前を持つ場合、' Person'クラスは新しい 'Name'値を受け入れてはいけません。 'Person'か検証コードがそのコレクションに直接的または間接的にアクセスしない限り、要件を満たす方法はありません。カスタムの 'ValidationRule'は行く方法のようです。あなたが試したことの詳細と、それがうまくいかなかった理由を教えてください。サンプルコード?例外または誤った動作? – phoog
はい、これも私が思ったことです。最新のサンプルコードについては、質問をご覧ください。 –