0

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」というダミー プロパティを使用して、コミット ボタンを再び点灯させることができます。解雇した。

私が言うように、それは機能しますが、気分が悪いです。誰かがより良いアイデアを得ましたか?

よろしくお願いします。

4

1 に答える 1

1

私の経験から、DataForm を使用するのは理想的ではなく、いくつかの制限があることを知っています。そうは言っても、あなたのソリューションは私が提案しているソリューションよりもクリーンだと思いますが、代替案を提供しているだけです。

データフォームが特定のプロパティ通知を (実際には) '無視' する方法を教えてください。あなたができることは、特定のプロパティが発生しているかどうかを確認し、そのプロパティを無視する必要がある場合は、コミット ボタンを手動で無視して以前の状態にリセットすることです。

        someViewModel.PropertyChanged += (sender, e) =>
                                             {
                                                 Grid dependencyObject = VisualTreeHelper.GetChild(TheDataForm, 0) as Grid;
                                                 var commitButton = dependencyObject.FindName("CommitButton") as Button;
                                                 commitButton.IsEnabled = !e.PropertyName.Equals("PropertyToIgnore");
                                             };

次に、データフォームから継承し、プロパティをバインドして無視できる依存関係プロパティを作成することで、それを微調整できます。

繰り返しますが、あなたの解決策はよりクリーンなものだと思います。

于 2011-08-27T15:20:27.600 に答える