2010-04-12 87 views
1

我只注意到WPF的TreeView的一些奇怪的行爲。我添加了兩個ItemContainerStyle綁定到我的ViewModel的「IsSelected」和一個ItemsTemplated來自定義顯示我的數據。但是現在用戶不能再改變選擇的節點了。出於測試目的,我使用ListView和Expander創建了一個類似的UI。這個版本可以作爲例外。任何提示爲什麼TreeView會失敗?奇怪行爲WPF TreeView ItemContainerStyle和ItemTemplate

<TreeView ItemsSource="{Binding ElementName=frame, Path=list}"> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}" > 
       <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/> 
      </Style> 
     </TreeView.ItemContainerStyle> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate> 
       <TreeViewItem Header="{Binding}"> 
        <TextBlock Text="{Binding Path= Item.SomeData}"/> 
       </TreeViewItem> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

編輯:我的數據不是等級的。我只想在顯示列表時獲得「摺疊」功能。 Item.SomeData不是一個列表。數據的顯示是根據需要的。只有通過鼠標選擇失敗!

alt text http://img682.imageshack.us/img682/3702/bildy.png

+0

什麼在我awer沒有爲你工作?或者你已經解決了你的問題了嗎? – Dabblernl 2010-04-14 21:12:24

+0

你在你的答案中付出了一些努力。但這並不能真正解決我的問題。我編輯了我的問題,使我的問題更容易理解。 – Matze 2010-04-19 14:19:54

回答

3

的TreeView工作方式不同。 HierarchicalDataTemplate中的項目 TreeViewItems和您在HierarchicalDataTemplate中指定的任何控件都將用作其標題。所以,基本上你要指定TreeView中的Items是TreeViewItems和TreeViewItems作爲它們的頭文件!相反,試試這個:

<HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
     <Label Content="{Binding}"/> 
     <HierarchicalDataTemplate.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path= Item.SomeData}"/> 
     </DataTemplate> 
     </HierarchicalDataTemplate.ItemTemplate> 
    </HierarchicalDataTemplate> 

編輯:我無法重現該生產要綁定的屬性數據源,所以我寫了我自己的一些簡單的代碼,顯示它是如何工作。希望你能適應你的需求:

<TreeView ItemsSource="{Binding}" Name="Tree"> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}" > 
        <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/> 
       </Style> 
      </TreeView.ItemContainerStyle> 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
        <Label Content="{Binding Name}"/> 
        <HierarchicalDataTemplate.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path= SomeData}"/> 
         </DataTemplate> 
        </HierarchicalDataTemplate.ItemTemplate> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Windows; 

namespace TreeViewSpike 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      List = new List<ItemList> 
         { 
          new ItemList 
           { 
            Name = "MyList", 
            Items = new List<Item> {new Item("1"), 
                  new Item("2")} 
           }, 
          new ItemList 
           { 
            Name = "MySecondList", 
            Items = new List<Item> {new Item("3"), 
                  new Item("4")} 
           } 
         }; 
      Tree.DataContext = List; 
      List[1].IsSelected = true; 
     } 

     public List<ItemList> List { get; set; } 
    } 

    public class ItemList: INotifyPropertyChanged 
    { 
     public string Name{ get; set;} 
     private bool _isSelected; 
     public bool IsSelected 
     { 
      get { return _isSelected; } 
      set 
      { 
       _isSelected = value; 
       if (PropertyChanged != null) 
        PropertyChanged(this, 
         new PropertyChangedEventArgs("IsSelected")); 
       if(_isSelected) 
        MessageBox.Show(Name + " selected"); 
      } 
     } 

     public List<Item> Items { get; set; } 
     public event PropertyChangedEventHandler PropertyChanged; 
    } 

    public class Item 
    { 
     public string SomeData { get; set; } 
     public Item(string data) 
     { 
      SomeData = data; 
     } 
    } 
}