2008-09-23 82 views
4

如果我想在Silverlight中将集合绑定到某种形式的列表控件。唯一的方法是使集合中的底层对象实现INotifyPropertyChanged,并使集合成为Observablecollection?使用Silverlight进行数据绑定

如果我使用的是某种第三方对象,例如Web服务返回的对象,我将不得不将它包装或映射到实现INotifyPropertyChanged的东西?

回答

5

没有,一旦你添加一个服务引用在Visual Studio中的Silverlight项目,您可以用鼠标右键单击它,并将其配置使得它使用一个ObservableCollection(这是默认设置反正)

此外,服务引用将默认确保服务的返回类型已经实现INotifyPropertyChanged。

1

您可以将列表绑定到任何IEnumerable集合或任何对象属性的简单控件。缺点是如果项目被添加到列表中或者属性发生更改,则不会收到通知。所以这取决于你的应用程序,如果这是一个问题或不。

1

正如Maurice所说,您可以绑定到任何集合(即使IEnumerable),绑定也可以工作,但您不会收到更改通知。但是请注意,您不需要使用ObservableCollection,任何实现INotifyCollectionChanged的东西都可以工作(尽管ObservableCollection是最简单的)。

集合中的对象不需要实现INotifyPropertyChanged,但是如果他们这样做,那么您将收到关于每个单独更改的通知。

0

只是要清楚,你可以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”的问题。