2010-04-12 9 views
1

Я просто заметил странное поведение TreeView WPF. Я добавил элемент ItemContainerStyle для привязки к «IsSelected» из моей модели ViewModel и ItemsTemplated для пользовательского отображения моих данных. Но теперь пользователь больше не может изменять выбранный узел. Для целей тестирования я создал аналогичный интерфейс с помощью ListView и Expander. Эта версия работает как исключенная. Любые советы, почему 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> 

EDIT: Мои данные не иерархичны. Я просто хочу получить функцию «свернуть» при отображении списка. Item.SomeData - это не список. Отображение данных по желанию. Только выбор с помощью мыши не удался!

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

+0

Что в моем андре не сработало для вас? Или вы уже решили свою проблему? – Dabblernl

+0

Вы вложили немного усилий в свой ответ. Но это не решает мою проблему. Я отредактировал мой вопрос, чтобы сделать мою проблему более понятной. – Matze

ответ

3

TreeViews работают по-разному. Элементы внутри HierarchicalDataTemplate : TreeViewItems и любой элемент управления, указанный вами в HierarchicalDataTemplate, будут функционировать как заголовок. Итак, в основном вы указываете, что элементы в TreeView являются TreeViewItems с TreeViewItems в качестве заголовков! Вместо этого попробуйте:

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

EDIT: Я не мог воспроизвести DataSource, который производит свойства, которые вы хотите связать, поэтому я написал простой код мой собственный, который показывает, как все это работает. Надеюсь, вы сможете приспособить его к вашим потребностям:

<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; 
     } 
    } 
} 
Смежные вопросы