2011-07-07 2 views
3

MVVMでWPF/C#を使用するアプリケーションで作業しています。私はListBoxに縛られている1つの特定のObservableCollection<>を持っています。
OnStartup()を呼び出すと、すべてのWPFバインディングが機能することが保証されていますか?

シナリオ1:アプリケーションが実行されている場合、私はこのObservableCollection<>を変更し、ListBox期待通りに移入されます。

シナリオ2:新しい要件では、このリストボックスにデフォルトでいくつかの初期値を入力する必要があります。そこで私はViewModelで初期化するためのメソッドを追加しました。 View & ViewModelを初期化した後、このメソッドをOnStartup()で呼び出します。 DataContextも適切に設定されます。このシナリオでは、値はObservableCollection <で更新されますが、残念ながらListBoxには反映されません。

OnStartup()に何か問題がないかどうかを確認するために、OnStartup()の代わりにViewからContentRenderedのコールバックに同じメソッド呼び出しを追加しました。

私の質問正確にMVVMがすべてのバインディングが正しく設定されていることを保証するのはいつですか?

編集: つ以上の観測私はメッセージ/ダイアログのリストボックスを開く場合に予想されるとして、移入されます。 ContentRenderedコールバックを呼び出します。そして、それは正しく挿入されます。

私はContentRenderedがバインディングを保証する関数であることをほとんど確信しています。

答えて

3

コードの変更を見ることなく、これが問題であるとは確信できませんが、バインディングするプロパティの初期値はnullになるようです。

その後、そのプロパティーをObservableCollection<T>に設定すると、自動変更通知はありません。

プロパティ値が(nullから何かに)変更されたことを通知し、その後ObservableCollection<T>に変更通知を処理させることもできます。

より良い解決策は、get-goから空のObservableCollection<T>を使用してプロパティを初期化することです。初期設定をデフォルト値にすると、これらの値を追加して変更通知が期待どおりに行われるはずです。

null以外のコレクションから開始して、通知を呼び出さずにそのプロパティを新しいコレクションインスタンスに設定することで、同じ問題が発生する可能性がありますが、100%確実ではありません。

これが問題でない場合は、もう一度見ていただきたいと思います。

+0

返信いただきありがとうございます。プロパティは既に空の 'ObservableCollection 'で初期化されています。私が理解しようとしている問題は、同じことが通常のユースケースではうまくいきます。それはちょうど出発点です。私はいくつかの詳細を編集して追加しました。 – vrrathod

関連する問題