使用Silverlight进行数据绑定
如果我想将集合绑定到Silverlight中的某种形式的列表控件。这样做的唯一方法是使集合中的基础对象实现INotifyPropertyChanged并使该集合成为Observablecollection吗?
如果我使用某种第三方对象(例如,Web服务返回的对象),则必须将其包装或者映射到实现INotifyPropertyChanged的对象上。
解决方案
我们可以将列表绑定到任何IEnumerable集合,也可以将简单控件绑定到任何对象属性。缺点是,如果将项目添加到列表或者更改属性,则不会收到任何更改通知。因此,这是否取决于问题取决于应用程序。
否,一旦在Visual Studio中向Silverlight项目添加了服务引用,就可以右键单击它并对其进行配置,以使其使用ObservableCollection(无论如何这都是默认设置)
另外,默认情况下,服务参考将确保服务的返回类型已经实现INotifyPropertyChanged。
正如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"的问题。