4

如果我想将集合绑定到 Silverlight 中某种形式的列表控件。这样做的唯一方法是使集合中的基础对象实现 INotifyPropertyChanged 并使集合成为 Observablecollection?

如果我使用某种第三方对象,例如由 Web 服务返回的对象,我必须将其包装或映射到实现 INotifyPropertyChanged 的​​东西?

4

4 回答 4

5

不,一旦您在 Visual Studio 中添加了对 silverlight 项目的服务引用,您可以右键单击它并对其进行配置,使其使用 ObservableCollection(无论如何这是默认设置)

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

于 2008-09-23T15:30:50.997 回答
1

您可以将列表绑定到任何 IEnumerable 集合或将简单控件绑定到任何对象属性。不利的一面是,如果将项目添加到列表或更改了属性,您将不会收到任何更改通知。因此,这是否存在问题取决于您的应用程序。

于 2008-09-23T15:14:11.143 回答
1

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

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

于 2008-09-23T15:58:12.613 回答
0

需要明确的是,您可以OneTime绑定到任何对象。如果您想要OneWayTwoWay绑定,您将需要一个对象支持这些接口之一。如前所述,为通过 web 服务交付的对象创建服务引用会为您执行此操作。但是,如果由于某种原因,您仍然需要从旧类生成 Bindable 对象,则可以实现一个实现 IValueConverter 的转换器,然后使用它将旧对象“包装”在一个 Bindable 中:

<UserControl>
    <UserControl.Resources>
        <local:FooToBindableFooConverter x:Key="BindableFooConverter"/>
    </UserControl.Resources>
    <TextBlock Text="{Binding FooInstance, Converter={StaticResource BindableFooConverter}}"/>

</UserControl>

转换器非常强大,可以解决很多“我需要 X 但我有 Y”的问题。

于 2009-02-28T15:48:58.507 回答