2013-11-21 51 views
0

我有下面的遞歸數據結構,我想將它綁定到樹視圖。但我無法弄清楚如何指定我的數據模板/分層數據模板。WPF Treeview綁定到多個嵌套列表

public class MediaContent 
{ 
    public MediaContent() 
    { 
     this.Sequences = new List<MediaSequence>(); 
     this.Items = new List<MediaItem>(); 
    } 

    public List<MediaSequence> Sequences 
    { 
     get; 
     set; 
    } 

    public List<MediaItem> Items 
    { 
     get; 
     set; 
    }   
} 

public class MediaSequence 
{ 
    public MediaSequence() 
    { 
     this.Sequences = new List<MediaSequence>(); 
     this.Items = new List<MediaItem>(); 
    } 

    public List<MediaSequence> Sequences 
    { 
     get; 
     set; 
    } 

    public List<MediaItem> Items 
    { 
     get; 
     set; 
    } 
} 

public class MediaItem 
{ 
    public string Filename 
    { 
     get; 
     set; 
    } 
} 

困難來了,因爲每個節點可以包含2個列表,並且列表是遞歸的。示例數據如下所示。

var uberNestedSequence = new MediaSequence(); 
uberNestedSequence.Items.Add(new MediaItem { Filename = "video1.mp4" }); 
uberNestedSequence.Items.Add(new MediaItem { Filename = "video2.avi" }); 

var nestedSequence = new MediaSequence(); 
nestedSequence.Sequences.Add(uberNestedSequence); 

var nestedSequence2 = new MediaSequence(); 

this.Media.Sequences.Add(nestedSequence); 
this.Media.Sequences.Add(nestedSequence2); 

那麼,如何在WPF樹視圖中顯示此數據?

<TreeView Margin="5" VerticalAlignment="Top" Grid.Row="1" ItemsSource="{Binding Media}"> 

我已經嘗試了下面,但顯然你不能指定2個不同的模板爲相同的數據類型。

<HierarchicalDataTemplate DataType="{x:Type local:MediaSequence}" ItemsSource="{Binding Sequences}"> 
    <TextBlock Text="sequence" /> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type local:MediaSequence}" ItemsSource="{Binding Items}"> 
    <TextBlock Text="item" /> 
</HierarchicalDataTemplate> 

讚賞任何幫助,感謝

+0

您將有一個MediaSequence或MediaItem類型的樹,但你不能在你的樹中都有。 –

+0

如果有人使用TemplateSelector,它會工作嗎? – user2799180

回答

5

好讓我們先在最簡單的事情方面解決這個問題,它應該幫助清除出你的思維。它看起來可能不是這樣,但你並沒有比我們通常看到的普通文件夾和文件更復雜。

因此,如果我們用樹的末端首先啓動,我們可以定義

<DataTemplate DataType="{x:Type local:MediaItem}"> 
    <TextBlock Text="item" /> 
</DataTemplate> 

我們沒有任何子項目所以它只是一個普通的模板。

移動到樹的更深處,我們現在有MediaSequence的節點,它們同時具有項目和序列。如果我們只能把它們當作一件事物呢?

那麼,如果我們堅持文件系統類比,你會發現DotNet定義爲FileInfo s和DirectoryInfo s作爲基地FileSystemInfo的派生。我們所需要做的就是一樣的。

public interface IMedia 
{ 
    // Actually they have nothing in common 
} 

public class MediaItem : IMedia 
{ 
    ... 
} 

public class MediaSequence : IMedia 
{ 
    public IEnumerable<IMedia> Children 
    { 
    get 
    { 
     // This one collection can now expose both types 
     // but can be anything behind the scenes 
     return Sequences.Concat(Items); 
    } 
    } 
} 

,然後允許我們定義其他模板

<HierarchicalDataTemplate DataType="{x:Type local:MediaSequence}" ItemsSource="{Binding Children}"> 
    <TextBlock Text="sequence" /> 
</HierarchicalDataTemplate> 

如果你真的需要,你可以定義你的根是不同的東西太多,但它實際上只是一個序列。

public class MediaContent : MediaSequence 
{ 
    ... 
} 
+0

這很好,非常感謝。在調用concat方法之前,我只需要更改children屬性來首先將每個列表轉換爲IMedia,否則將無法編譯。我當然可以將我的列表更改爲IMedia類型,但我更喜歡該類型是明確的。 – RobJohnson