2011-05-18 64 views
4

如何「雙向綁定」一個分層的數據結構到一個扁平的WPF數據網格?分層數據綁定到一個扁平的WPF數據網格

應用程序接口模型是iTunes - 我正在尋找datagrid顯示爲扁平(不是主/明細網格)。用戶看到包含藝術家,專輯和歌曲的行;但是數據以層次結構存儲在藝術家包含包含歌曲列表的專輯列表的地方。

當用戶重命名一個專輯時,層次結構自動爲給定的藝術家找到或創建新的專輯(基於Album.Name),並將樂曲移動到專輯。

在平面數據和分層數據之間添加翻譯層似乎是一個不好的解決方案。

更新1
通過回答看完後,它的出現實現我上面描述的內容離不開大量的幕後工作來完成。我似乎應該重新考慮以這種方式代表我的數據。

+0

如果沒有它,你怎麼辦? – soandos 2011-05-18 04:39:09

+0

@soandos我試圖找出一個聰明的方式來做到這一點,我不知道是否有一個已知的解決方案 - 我遇到了ITypedList接口,不知道這是否合適。看起來好像我試圖設計綁定到綁定 – sfm 2011-05-18 04:48:57

回答

0

結構的展平可以通過使用LINQ投影完成。 See the one-to-many projection in this article

所有你必須處理的是,當你的集合發生變化時,你需要重新查詢。

我沒有看到讓它變得更容易的方法,無論是LINQ查詢還是特殊綁定或轉換器,總會需要翻譯層,除非您找到可以爲您做的網格。

+0

您會考慮在Hierarchy中包含對父對象的引用,並試圖找到一種方法來綁定結構,即Album.ParentArtist? – sfm 2011-05-18 05:13:53

+0

是的,我會考慮這一點(我可以稱之爲Album.Artists,但這只是我,因爲我期待多對多的關係) – 2011-05-18 06:09:28

0

我不喜歡翻譯層,但似乎是最簡單的解決方案。

除此之外,你可以編寫自己的自定義模板。因此,舉例來說,如果你有結構類似的數據:專輯>宋,你希望它在這張圖片中顯示,如:http://files.jerahmeelcosinas.net/stackoverflow/itunes.jpg

它會沿着這條路線的東西:

<ItemsControl ItemsSource="{Binding Albums}"> 
<ItemsControl.Template> 
    <ControlTemplate> 
     <DockPanel> 
      <StackPanel Orientation="Vertical" DockPanel.Dock="Left"> 
       <Image Source="{Binding AlbumImage}"/> 
       <TextBlock Text="{Binding AlbumName}"/> 
      </StackPanel> 
      <ListView ItemsSource="{Binding Songs}" > 
       <ListView.View> 
        <GridView> 
         <GridViewColumn DisplayMemberBinding="{Binding SongName}" Header="Name" /> 
         <GridViewColumn DisplayMemberBinding="{Binding SongLength}" Header="Length" /> 
        </GridView> 
       </ListView.View> 
      </ListView> 
     </DockPanel> 
    </ControlTemplate> 
</ItemsControl.Template> 

你可以在運行期間切換ItemsControl模板以在視圖之間切換(對於平面歌曲列表或按專輯排序的列表)。