如果我想将集合绑定到Silverlight中的某种形式的列表控件。是唯一的方法,这样使集合中的底层对象实现INotifyPropertyChanged,并使集合成为Observablecollection?
如果我使用某种第三方对象,例如由Web服务返回的对象,我必须将其包装或映射到实现INotifyPropertyChanged的内容?
答案 0 :(得分:5)
不,在Visual Studio中向Silverlight项目添加服务引用后,可以右键单击它并进行配置,使其使用ObservableCollection(无论如何都是默认设置)
此外,默认情况下,服务引用将确保服务的返回类型已实现INotifyPropertyChanged。
答案 1 :(得分:1)
您可以将列表绑定到任何IEnumerable集合或对任何对象属性的简单控件。缺点是,如果将项目添加到列表或更改属性,则不会获得chnage通知。因此,如果这是一个问题,这取决于您的应用程序。
答案 2 :(得分:1)
正如Maurice所说,你可以绑定到任何集合(甚至IEnumerable),绑定也可以,但你不会得到更改通知。但是请注意,您不需要使用ObservableCollection,任何实现INotifyCollectionChanged的东西都可以工作(尽管ObservableCollection是最简单的)。
集合中的对象无需实现INotifyPropertyChanged,但如果有,则会收到有关每次更改的通知。
答案 3 :(得分:0)
为了清楚起见,您可以 OneTime 绑定到任何对象。如果您想 OneWay 或 TwoWay 绑定,您将需要一个对象支持其中一个接口。如上所述,创建服务引用可以为您通过webservice传递的对象执行此操作。但是,如果由于某种原因,您仍然需要从遗留类中生成Bindable对象,则可以实现一个实现IValueConverter的Converter,然后使用它将您的旧对象“包装”在一个可绑定的对象中:
<UserControl>
<UserControl.Resources>
<local:FooToBindableFooConverter x:Key="BindableFooConverter"/>
</UserControl.Resources>
<TextBlock Text="{Binding FooInstance, Converter={StaticResource BindableFooConverter}}"/>
</UserControl>
转换器非常强大,可以解决许多“我需要X但我有Y”的问题。