如果我想在Silverlight中将集合绑定到某种形式的列表控件。唯一的方法是使集合中的底层对象实现INotifyPropertyChanged,并使集合成为Observablecollection?使用Silverlight进行数据绑定
如果我使用的是某种第三方对象,例如Web服务返回的对象,我将不得不将它包装或映射到实现INotifyPropertyChanged的东西?
如果我想在Silverlight中将集合绑定到某种形式的列表控件。唯一的方法是使集合中的底层对象实现INotifyPropertyChanged,并使集合成为Observablecollection?使用Silverlight进行数据绑定
如果我使用的是某种第三方对象,例如Web服务返回的对象,我将不得不将它包装或映射到实现INotifyPropertyChanged的东西?
没有,一旦你添加一个服务引用在Visual Studio中的Silverlight项目,您可以用鼠标右键单击它,并将其配置使得它使用一个ObservableCollection(这是默认设置反正)
此外,服务引用将默认确保服务的返回类型已经实现INotifyPropertyChanged。
您可以将列表绑定到任何IEnumerable集合或任何对象属性的简单控件。缺点是如果项目被添加到列表中或者属性发生更改,则不会收到通知。所以这取决于你的应用程序,如果这是一个问题或不。
正如Maurice所说,您可以绑定到任何集合(即使IEnumerable),绑定也可以工作,但您不会收到更改通知。但是请注意,您不需要使用ObservableCollection,任何实现INotifyCollectionChanged的东西都可以工作(尽管ObservableCollection是最简单的)。
集合中的对象不需要实现INotifyPropertyChanged,但是如果他们这样做,那么您将收到关于每个单独更改的通知。
只是要清楚,你可以OneTime绑定到任何对象。如果你想单向或双向绑定你会ned一个对象支持其中一个接口。如前所述,创建服务引用为您通过web服务传递对象。但是,如果由于某种原因,您仍然需要从传统类生成Bindable对象,则可以实现一个实现IValueConverter的Converter,然后使用它将您的传统对象“包装”到一个可绑定的对象中:
<UserControl>
<UserControl.Resources>
<local:FooToBindableFooConverter x:Key="BindableFooConverter"/>
</UserControl.Resources>
<TextBlock Text="{Binding FooInstance, Converter={StaticResource BindableFooConverter}}"/>
</UserControl>
转换器是非常强大的,可以解决大量的“我需要X但我有Y”的问题。