2008-09-23 79 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」的問題。