2017-09-01 96 views
5

我想在樹形視圖中顯示一些對象,但是很遺憾沒有成功。帶嵌套列表的TreeView

我有一個對象ObservableCollection <ICustom>Settings.ListOfCustomers

對象ICustom接口:

int Id { get; } 
int age { get; } 
CustomerType CustomerType { get; } 
ObservableCollection<IValue> ListOfValues { get; } 

ObservableCollection<IValue> ListOfValues也有一些屬性,如:

String Name { get; } 

筆者認爲:

<TreeView ItemsSource="{Binding ListOfCustomers, UpdateSourceTrigger=PropertyChanged}"> 

    <TreeView.Resources> 

     <HierarchicalDataTemplate DataType="{x:Type customerConfig:ICustomer}"> 
      <TextBlock Text="{Binding Id}"/> 
     </HierarchicalDataTemplate> 

     <HierarchicalDataTemplate DataType="{x:Type valueConfig:IValue}" ItemsSource="{Binding ListOfValues}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}"/> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

    </TreeView.Resources> 


</TreeView> 

問題: 如何顯示在TreeView中顯示這些對象?我的方法(請參閱「我的視圖」)不起作用。

+0

ITemSource應該是ListOfCustomers。它假定你想修改只有getter屬性的設置。嘗試其他方式 – Ramankingdom

回答

3

對於問題1:ObservableCollections具有的優點是,視圖的所有通知都是自動完成的。因此,您不必擔心NotifyPropertyChanged事件用於添加/刪除集合中的對象。

對於問題2:您的ViewModel是您的DataContext?我沒有看到哪裏有一個屬性ObservableCollection<ICustomer>?你能否提供關於這些課程中關係的更多細節?

編輯:

基於對MM8答案,X:type屬性應該是一個具體的類型。因此,代碼應該是這個樣子:

我建議你在你的ViewModelObservableCollection<ICustomer> ListOfCustomers,那麼你就可以在視圖綁定:

<TreeView ItemsSource="{Binding ListOfCustomers}"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type Customer}"> 
       <TextBlock Text="{Binding Id}"/> 
      </HierarchicalDataTemplate> 

      <HierarchicalDataTemplate DataType="{x:Type modSettings:Value}" 
           ItemsSource="{Binding ListOfValues}"> 
       <TextBlock Text="{Binding Name}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

我覺得這個線程提供了更詳細的解決方案你問題:Implement WPF treeview with different Parent Nodes a well as different child nodes?

EDIT2:

我改變了我的代碼位,以滿足您的要求。這應該顯示所有節點:

<TreeView ItemsSource="{Binding ListOfCustomers}" > 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Path=ListOfValues}" DataType="{x:Type Customer}"> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <HierarchicalDataTemplate DataType="{x:Type modSettings:Value}"> 
         <TextBlock Text="{Binding Path=Name}"/> 
        </HierarchicalDataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
       <TextBlock Text="{Binding Path=Id}"/> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
+0

通過這種方式,我只能看到ListOfCustomers的對象 – Philies

+0

對不起,我的實現中有一個錯誤。我用正確的代碼編輯了我的答案。我希望這能解決你的問題。 –

2

我已經全部轉換列表來ObservableCollection,還嵌套列表。這是必要的和正確的嗎?

除非您打算在運行時動態添加項目到集合中,否則不需要。然後,您需要使用ObservableCollection<T>來自動顯示TreeView。 Othwerwise,你可以使用List<T>

如何在TreeView中顯示這​​些對象?

您收到錯誤消息,因爲您將模板添加到TreeViewItems屬性中。他們應該被添加到Resources屬性中,即您需要添加一個<TreeView.Resources>元素。與DataType屬性設置爲接口類型不應用於

Why can't a DataTemplate bind to an interface when that DataTemplate was explicitly returned from a DataTemplateSelector?

模板:

你也應該閱讀。所以你應該定義一個HierarchicalDataTemplate每個具體類型或使用DataTemplateSelector