2015-05-21 121 views
1

我想顯示一個包含實現接口的元素的TreeView。該接口由兩個主要類實現,這兩個類是我想要顯示的類。繼承類型的TreeView

的模式是這樣的:

IElement 
    Container : IElement 
     ->public IEnumerable<IElement> Elements {get; set;} 
    Element : IElement 

因此,基本上,這個TreeView控件必須能夠在任何級別的展示容器和元素。容器應該是「可擴展的」(因爲它們包含其他IE元素),但元素不應該。

所以this solution似乎不合適,因爲它設置了兩個完全不同的級別(企業/員工)。

我看不出我如何用IElements填充TreeView,同時能夠檢查它們是容器還是元素,以及如何防止只擴展這些類型之一。

+0

測試是否元素是一個容器:'如果(元素是容器)...' –

回答

2

這是什麼沿着你尋找什麼? 這裏有一個例子:

CS:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public List<IElement> Elements 
    { 
     get 
     { 
      var list = new List<IElement>(); 

      list.Add(BuildContainer()); 
      list.Add(BuildContainer()); 
      list.Add(new Element()); 

      return list; 
     } 
    } 

    private Container BuildContainer() 
    { 
     var container = new Container(); 

     container.Elements.Add(new Element()); 
     container.Elements.Add(new Element()); 

     var sub_container = new Container(); 
     sub_container.Elements.Add(new Element()); 

     container.Elements.Add(sub_container); 

     return container; 
    } 
} 

public interface IElement 
{ 
    string Title { get; } 
} 

public class Container : IElement 
{ 
    public string Title 
    { 
     get { return "Container"; } 
    } 

    private ObservableCollection<IElement> elements; 
    public ObservableCollection<IElement> Elements 
    { 
     get 
     { 
      if (elements == null) 
      { 
       elements = new ObservableCollection<IElement>(); 
      } 
      return elements; 
     } 
    } 
} 

public class Element : IElement 
{ 
    public string Title 
    { 
     get { return "Element"; } 
    } 
} 

XAML:

<Window 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 

    <DataTemplate DataType="{x:Type local:Element}"> 
     <TextBlock Text="{Binding Title}" Foreground="Red" FontSize="14"/> 
    </DataTemplate> 

    <HierarchicalDataTemplate DataType="{x:Type local:Container}" ItemsSource="{Binding Elements}"> 
     <TextBlock Text="{Binding Title}" Foreground="Black" FontWeight="Bold" FontSize="16"/> 
    </HierarchicalDataTemplate> 
</Window.Resources> 


<Grid> 
    <TreeView ItemsSource="{Binding Elements}" /> 
</Grid> 

結果:

​​

+0

當別人做它時,它看起來很容易。這正是我要找的。它讓我明白了在TreeView中使用HierarchicalDataTemplate和DataTemplate。非常感謝。 – Kilazur

+0

是的,這是棘手的概念。我記得起初我沒有明白 –

+0

現在這對你來說是一個挑戰,可以說你只有一個根節點,並且你希望它看起來完全不同。 –

0

bool類型的另一個屬性IsExpandable添加到您的IElementinterface。請將此屬性設置爲true,僅爲Container類,並使用BindingTrigger中的此屬性爲您的TreeViewItem