如果我想将集合绑定到 Silverlight 中某种形式的列表控件。这样做的唯一方法是使集合中的基础对象实现 INotifyPropertyChanged 并使集合成为 Observablecollection?
如果我使用某种第三方对象,例如由 Web 服务返回的对象,我必须将其包装或映射到实现 INotifyPropertyChanged 的东西?
如果我想将集合绑定到 Silverlight 中某种形式的列表控件。这样做的唯一方法是使集合中的基础对象实现 INotifyPropertyChanged 并使集合成为 Observablecollection?
如果我使用某种第三方对象,例如由 Web 服务返回的对象,我必须将其包装或映射到实现 INotifyPropertyChanged 的东西?
不,一旦您在 Visual Studio 中添加了对 silverlight 项目的服务引用,您可以右键单击它并对其进行配置,使其使用 ObservableCollection(无论如何这是默认设置)
此外,默认情况下,服务引用将确保服务返回的类型已实现 INotifyPropertyChanged。
您可以将列表绑定到任何 IEnumerable 集合或将简单控件绑定到任何对象属性。不利的一面是,如果将项目添加到列表或更改了属性,您将不会收到任何更改通知。因此,这是否存在问题取决于您的应用程序。
正如 Maurice 所说,您可以绑定到任何集合(甚至 IEnumerable)并且绑定将起作用,但您不会收到更改通知。但是请注意,您不需要使用 ObservableCollection,任何实现 INotifyCollectionChanged 的东西都可以工作(尽管 ObservableCollection 是最简单的)。
集合中的对象没有必要实现 INotifyPropertyChanged,但如果他们这样做了,那么您将收到有关每个单独更改的通知。
需要明确的是,您可以OneTime绑定到任何对象。如果您想要OneWay或TwoWay绑定,您将需要一个对象支持这些接口之一。如前所述,为通过 web 服务交付的对象创建服务引用会为您执行此操作。但是,如果由于某种原因,您仍然需要从旧类生成 Bindable 对象,则可以实现一个实现 IValueConverter 的转换器,然后使用它将旧对象“包装”在一个 Bindable 中:
<UserControl>
<UserControl.Resources>
<local:FooToBindableFooConverter x:Key="BindableFooConverter"/>
</UserControl.Resources>
<TextBlock Text="{Binding FooInstance, Converter={StaticResource BindableFooConverter}}"/>
</UserControl>
转换器非常强大,可以解决很多“我需要 X 但我有 Y”的问题。