Если я хочу привязать коллекцию к некоторой форме управления списком в Silverlight. Единственный способ сделать это - сделать так, чтобы базовые объекты в коллекции реализовали INotifyPropertyChanged и чтобы коллекция была Observablecollection?
Если бы я использовал какой-то сторонний объект, например, возвращаемый веб-службой, мне пришлось бы обернуть его или сопоставить с чем-то, что реализует INotifyPropertyChanged?





Вы можете привязать список к любой коллекции IEnumerable или простой элемент управления к любому свойству объекта. Обратной стороной является то, что вы не получаете уведомления об изменении, если элементы добавляются в список или свойства изменяются. Таким образом, это зависит от вашего приложения, если это проблема или нет.
Нет, как только вы добавите ссылку на сервис в свой проект silverlight в Visual Studio, вы можете щелкнуть его правой кнопкой мыши и настроить так, чтобы он использовал ObservableCollection (который в любом случае является настройкой по умолчанию)
Кроме того, ссылка на службу по умолчанию гарантирует, что типы, возвращаемые службой, уже реализуют INotifyPropertyChanged.
Как сказал Морис, вы можете выполнить привязку к любой коллекции (даже IEnumerable), и привязка будет работать, но вы не получите уведомлений об изменениях. Обратите внимание, однако, что вам не нужно использовать ObservableCollection, все, что реализует INotifyCollectionChanged, будет работать (хотя ObservableCollection является самым простым).
Объекты в коллекции не обязаны реализовывать INotifyPropertyChanged, но если они это сделают, вы будете получать уведомления о каждом отдельном изменении.
Чтобы было ясно, вы можете привязать Один раз к любому объекту. Если вы хотите связать Одностороннее движение или TwoWay, вам нужно, чтобы объект поддерживал один из этих интерфейсов. Как уже упоминалось, создание ссылки на службу делает это за вас для объектов, доставленных через веб-службу. Однако, если по какой-то причине вам все еще нужно создать объект Bindable из унаследованного класса, вы можете реализовать Converter, который реализует IValueConverter, а затем использовать его, чтобы «обернуть» свой устаревший объект в Bindable, живите вот так:
<UserControl>
<UserControl.Resources>
<local:FooToBindableFooConverter x:Key = "BindableFooConverter"/>
</UserControl.Resources>
<TextBlock Text = "{Binding FooInstance, Converter = {StaticResource BindableFooConverter}}"/>
</UserControl>
Конвертеры очень мощные и могут решить множество проблем типа «Мне нужен X, но у меня Y».