2014-06-17 75 views
0

最有關使用WPF與MVVM模式的實測值(迄今爲止)的文章中描述了結合的TreeView到相同的元件,例如樹http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewModeWPF,MVVM,裝訂TreeView的專有樹

在這些教程

,只有一個單獨的類,它包含相同類型的兒童,如其中有父母和子女類「人」。 TreeView使用HierarchicalDataTemplate綁定到一個類。

什麼,如果有一個選擇不同的類,它構建一個樹。作爲一個例子考慮這樣的xml:

<a x=1> 
    <b x=2> 
     <c x=3 /> 
     <c x=3 /> 
    </b> 
</a> 

所以每個XML元素被包裹入不同的類:類A,B和C.

如何正確地寫XAML結合那些?爲了顯示下面XAML第一層2

適於:

<TreeView ItemsSource="{Binding As}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Bs}"> 
      <TreeViewItem> 
       <TreeViewItem.Header> 
        <TextBlock Text="{Binding x}" /> 
       </TreeViewItem.Header> 
      </TreeViewItem> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
    </TreeView> 

但如何包括第三層,即C 1

回答

0

當顯示在WPF一個集合不同的數據類型,我們定義每種類型應該是什麼樣子使用DataTemplate秒。 但我們只能申請一個DataTemplate我聽到你喊...如果我們不是不要指定一個x:Key值,我們不會。所以,解決方法很簡單...定義DataTemplate每個數據類型,只是設置任何人的x:Key價值 - 這樣一來,該框架將隱含它們應用到單個項目。

<DataTemplate DataType="{x:Type SomePrefix:SomeType}"> 
    ... 
</DataTemplate> 

...

<DataTemplate DataType="{x:Type SomePrefix:AnotherType}"> 
    ... 
</DataTemplate> 

解決方案的最後一部分是確保您的所有數據類型的擴展,你需要創建一個基類:

public class SomeType : BaseDataType { ... } 

.. 。

public class AnotherType: BaseDataType { ... } 

現在你可以將數據綁定到col這種BaseDataType類型的經文您TreeView,並擴展了基類的任意類填充:

public ObservableCollection<BaseDataType> Items { get; set; } 

...

Items.Add(new SomeType()); 
Items.Add(new AnotherType()); 

...

<TreeView ItemsSource="{Binding Items}" ... /> 
+0

請參見上面 – etwas77

+0

使用*的話我的「PS」部分*描述你的問題。 – Sheridan

+0

對不起。用言語來說:如果我完全按照你的建議使用它:我只看到第一層。如果我修改它,包括HierarchicalDataTemplate,如我的原始示例中,我看到2層。而已。 – etwas77