2015-04-28 152 views
0

我正在用WPF和我的第一個MVVM項目來做我的第一個更大的項目。使用MVVM的WPF將元素動態添加到TreeView

我想用一個自定義類的列表填充一個TreeView。

我的XAML的一部分類似於這樣:

<Window> 
    <StackPanel> 
    ... 
     <TreeView> 
      <TreeViewItem> 
       <TreeViewItem /> 
       <TreeViewItem.ItemTemplate> 
        <HierarchicalDataTemplate 
         ItemsSource="{Binding ListOfFoo}"> 
         <StackPanel> 
          <CheckBox VerticalAlignment="Center" Width="50" 
             Content="{Binding Bar.Description}" IsChecked="{Binding IsChosen}"/> 
          <TextBox Width="38" VerticalAlignment="Center" 
            Text="{Binding SomeText}" IsEnabled="{Binding IsChosen}" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
       </TreeViewItem.ItemTemplate> 
      </TreeViewItem> 
     </TreeView> 
    ... 
    </StackPanel> 
</Window> 

在我的ViewModel屬性看起來是這樣的:

public List<Foo> ListOfFoo 
{ 
    get { return listoffoo; } 
    set 
    { 
     listoffoo = value; 
     OnPropertyChanged("ListOfFoo"); 
    } 
} 

美孚擁有的屬性IsChosen,酒吧(這是另一種類型的與一個屬性說明)和SomeText。

當我執行我的代碼時,我可以看到第一個項目顯示的TreeView(它有一些UI元素,我爲了更好的閱讀而忽略了),但項目(在我的測試用例中應該是2)沒有顯示。

我用以下資源:

Fill wpf treeview with mvvm

(誰能告訴我,其中x:類型來源於我沒有那個可以在我的X命名空間,其定義如下?

http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

什麼我做錯了嗎?任何幫助表示讚賞。

+0

這是一個簡明的例子,它是如何完成的http://stackoverflow.com/a/28994128/1228你可以創建一個新的項目並粘貼該代碼,它的工作原理。做到這一點,然後將其與您當前的項目進行比較,找出不同之處。 – Will

+0

你沒有使用ObservableCollection,也許這是問題? –

+0

您的x:類型問題 - 在PresentationCore中定義了xmlns。抓住Telerik的JustDecompile,加載net 4.5框架,然後點擊列表中的PresentationCore。您可以看到該名稱空間的xmlnsdefinition指向System.Windows.Markup。以下是它的實現方式https://msdn.microsoft.com/en-us/library/ms753322(v=vs.110).aspx – Will

回答

1

我想你想達到這樣的事:

<Window> 
    <StackPanel> 
     <TreeView ItemsSource="{Binding MainCollection}"> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding InnerCollection}"> 
        <StackPanel> 
         <CheckBox VerticalAlignment="Center" Width="50" 
            Content="{Binding Bar.Description}" IsChecked="{Binding IsChosen}"/> 
         <TextBox Width="38" VerticalAlignment="Center" 
           Text="{Binding SomeText}" IsEnabled="{Binding IsChosen}" /> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 

      <TreeViewItem /> 
     </TreeView> 
    </StackPanel> 
</Window> 

你的錯誤:

  • 設置ItemTemplateTreeViewItem,但你應該設置ItemTemplateTreeView
  • 您添加<TreeViewItem /><TreeViewItem>而不是<TreeView>
  • 你應該綁定到ItemsSourceTreeView與你的主要收藏和ItemsSourceHierarchicalDataTemplate收集每個元素內。例如,如果您有:

    • 玩家
      • 播放器1
          • 隊1
          • 隊2
      • 玩家2
          • 隊1個
          • 隊2

,那麼你應該設置在TreeView的球員名單和HierarchicalDataTemplate到隊列表綁定。