2012-08-31 34 views
0

我試圖將一個簡單的樹結構綁定到Win 8(以前稱爲)Metro應用程序中的ItemsControl的itemsSource。 我的結構實現了INotifyPropertyChanged接口,並且當它的任何子節點發生變化時也會通知它。作爲ItemsControl的ItemsSource的樹結構

我試着製作一個轉換器,它將我的樹變成了一個ObservableCollection,但創建綁定後,它不會刷新。

我做了如下的測試項目,以顯示我想什麼: https://skydrive.live.com/redir?resid=970FFC53F4B7A598!146

在這個簡單的項目的問題,如果你按下底部的應用程序欄上的添加按鈕,它在創建新的子層次結構,但ListView不刷新。

我想念的是什麼,或者我該怎麼做?

回答

1

這應該是相當簡單的,使用DataTemplate,例如,

<DataTemplate DataType="{x:Type local:TreeItemType}"> 
    <StackPanel> 
     <ContentPresenter Content="{Binding Name}"/> 
     <ItemsControl ItemsSource="{Binding Children}"/> 
    <StackPanel> 
<DataTemplate> 

隱含應用它通過ItemsControl.Resources(所以它被應用到內ItemsControl爲好。


如果你只是想樹葉或再跟項目不是單一的單位你可以構建一個CompositeCollection,除了轉換器創建ObservableCollection這是永遠不會被修改,因爲只有視圖有一個引用它,你可以通過CollectionContainers包裝原始集合,通知將被保留。

+0

您可以發佈CompositeCollection和CollectionContainers解決方案的示例嗎? –

+0

嗯。我想在WinRT中沒有CompositeCollection和CollectionContainer類。我的問題是,我有一個面板,它定製了它的兒童佈局。它很容易與ItemsControl一起使用,但如果我使用上面的解決方案保留層次結構,我不知道如何進行佈局。 –

+0

@adam_gav:這很不幸,你當然可以實現你自己的。我想我已經充分解釋了轉換器的問題,您需要保留對原始集合的引用並對其「CollectionChanged」事件做出反應。複合集合並不僅僅是轉發其子集合的事件。 –