2009-07-25 9 views
0

私は、ObservableCollection(Contactsという名前の)プロパティを持つオブジェクト(Clientという名前)をSilverlightビューにバインドします。 My Clientクラスにはisという文字列プロパティがいくつかあり、ObservalbeCollectionにはContactsという名前が付けられています。クライアントオブジェクト(INotifyPropertyChangedを実装している)という名前のビューモデルに、Clientオブジェクトを含むプロパティがあります。私はこのようなオブジェクトのObervableCollectionに私の見解では、リストボックスをバインドする場合:ViewModelプロパティをSilverlightでバインドできるようにする

のItemsSource =「{バインディングパス= Client.Contacts、モード=双方向}」

とコレクションに連絡先アイテムを追加し、ビューが正しく更新され、新しく追加された連絡先が表示されます。これはすべて素晴らしいです。

私はこの 公共のObservableCollectionコンタクトのような私のViewModel上の連絡先プロパティを作成した場合 { { 戻りClient.Contactsを取得します。 }ビューが更新されることはない

のItemsSource = "{バインディングパス=コンタクト、モード=双方向}"

にリストボックスに結合します。

私はこのようなクライアントに連絡先アイテムを追加します。

Client.Contacts.Add(newContact)

なぜ連絡先のリストボックスが更新されませんか?どうすれば変更できますか? Client.Contactsバインディングは使用できますか?新しい連絡先を追加した後でコードに休憩を入れると、新しい新しい連絡先オブジェクトがコレクションに追加されているように見えますが、ビューには追加が表示されません。

答えて

0

実行がItemsSource = "{Binding Path = Contacts、Mode = TwoWay}"に達したときにバインディングが実行されたときのように見えます。バインド時に連絡先インスタンスが設定されていないと感じるため、ViewModelのコンストラクタでコレクションをインスタンス化するかどうかを確認できますか?

+0

私が問題を解決しました。このようにコレクションにアイテムを追加する場合 Client.Contacts.Add(newContact) バインディングは、基になるプロパティの変更については決して通知されません。したがって、バインディングにプロパティの1つを更新したことを知らせるために、ContactプロパティのPropertyChangedイベントを発生させました。これでバインディングが通知されます。私の場合、ItemsSourceはContactsプロパティにバインドされ、変更に応答することができます。 ご協力いただきありがとうございます。 – DaveB

+0

しかし、あなたが記述したその解決策では、パフォーマンスが低下しています。コレクションの追加/削除を行うたびにItemsControl全体がアイテムのビジュアルを再構築するpropertychangedイベントを発生させています。むしろ典型的な方法は、INotifyCollectionChanged(ObservableCollectionに組み込まれています)を生成して、ItemsControlにすべてのアイテムを再作成するのではなく、関連するVisualのみをビルドさせることです。 –

+0

コレクションのバッキング変数を使用してアイテムを追加したり削除したりすると、引き続きpropertychangedイベントが発生しますか? – DaveB

関連する問題