Silverlight DataForm と子コレクションに関して興味深い問題があります。機能するソリューションもありますが、ハックのように感じます (ハックです)。誰かがよりエレガントなソリューションを持っているかどうか疑問に思っていました。
GroupViewModels のコレクションにバインドされた DataForm があります。各 GroupViewModel には UserViewModels の ObservableCollection があり、DataForm の EditTemplate が表示されているときにユーザーが追加および削除できるようにしたいと考えています。
これを行うための UI は、すべてのユーザーのリストを含む単純な ComboBox と、現在グループ内のユーザーの ListBox です。ユーザーをあるリストから別のリストに移動するための追加ボタンと削除ボタンがあります。
さて、... DataForm がバインドされているビュー モデルは IEditableObject を実装しています..編集がキャンセルされた場合にロールバック動作が発生するため、これはクールですが、この場合は十分ではありません。VM がダーティな状態かどうかを明示的に DataForm に伝える方法が必要です。
私のViewModelには、すべてのユーザーのComboBoxのSelectedItemがバインドされているSelectedUserToAddプロパティがあるため、ユーザーが追加するユーザーを選択すると、VMでPropertyChangedイベントが発生し、DataFormは何かが変更されたと考え、コミット(OK)ボタンが点灯します。また、SelectedUserToRemove プロパティにより、ListBox で選択が変更されたときにも点灯します。
明らかに、ListBox の UserViewModels が変更された場合にコミット ボタンが点灯するようにしたいのです。
解決策は簡単です。SelectedUserToAdd および SelectedUserToRemove プロパティから変更通知を削除すると、コミット ボタンの点灯を停止できます。また、AddUser または DeleteUser コマンドが取得されたときに NotifyPropertyChanged を発生させる「Dirty」というダミー プロパティを使用して、コミット ボタンを再び点灯させることができます。解雇した。
私が言うように、それは機能しますが、気分が悪いです。誰かがより良いアイデアを得ましたか?
よろしくお願いします。