コレクションをSilverlightの何らかの形式のリストコントロールにバインドする場合。これを行う唯一の方法は、コレクション内の基になるオブジェクトにINotifyPropertyChangedを実装させ、コレクションをObservablecollectionにする唯一の方法ですか?
たとえば、Webサービスによって返されるサードパーティのオブジェクトを使用している場合は、それをラップするか、INotifyPropertyChangedを実装するものにマップする必要がありますか?
コレクションをSilverlightの何らかの形式のリストコントロールにバインドする場合。これを行う唯一の方法は、コレクション内の基になるオブジェクトにINotifyPropertyChangedを実装させ、コレクションをObservablecollectionにする唯一の方法ですか?
たとえば、Webサービスによって返されるサードパーティのオブジェクトを使用している場合は、それをラップするか、INotifyPropertyChangedを実装するものにマップする必要がありますか?
いいえ、Visual Studio で Silverlight プロジェクトにサービス参照を追加したら、それを右クリックして、ObservableCollection を使用するように構成できます (いずれにせよ、これが既定の設定です)。
また、サービス リファレンスは、既定で、サービスの返される型が既に INotifyPropertyChanged を実装していることを確認します。
リストを任意の IEnumerable コレクションにバインドしたり、単純なコントロールを任意のオブジェクト プロパティにバインドしたりできます。欠点は、アイテムがリストに追加されたり、プロパティが変更されたりしても、変更通知を受け取らないことです。したがって、これが問題になるかどうかは、アプリケーションによって異なります。
Maurice が言ったように、任意のコレクション (IEnumerable を含む) にバインドでき、バインドは機能しますが、変更通知は取得されません。ただし、ObservableCollection を使用する必要はなく、INotifyCollectionChanged を実装するものはすべて機能することに注意してください (ただし、ObservableCollection が最も単純なものです)。
コレクション内のオブジェクトが INotifyPropertyChanged を実装する必要はありませんが、実装している場合は、個々の変更ごとに通知を受け取ります。
明確にするために、任意のオブジェクトにOneTimeバインドできます。OneWayまたはTwoWayバインドする場合は、オブジェクトがこれらのインターフェイスのいずれかをサポートしている必要があります。前述のように、サービス参照を作成すると、Web サービス経由で配信されるオブジェクトに対してこれが行われます。ただし、何らかの理由でレガシー クラスから Bindable オブジェクトを生成する必要がある場合は、IValueConverter を実装する Converter を実装し、それを使用してレガシー オブジェクトを Bindable オブジェクトに「ラップ」することができます。
<UserControl>
<UserControl.Resources>
<local:FooToBindableFooConverter x:Key="BindableFooConverter"/>
</UserControl.Resources>
<TextBlock Text="{Binding FooInstance, Converter={StaticResource BindableFooConverter}}"/>
</UserControl>
コンバーターは非常に強力で、多くの「X が必要だが Y がある」という問題を解決できます。