2010-10-13 55 views
4

ViewModel有2个字段。 NameChilds我需要这样的Wpf树视图

我需要这样的

1。当点击根元素时,执行2操作
first。扩大自己
second。选择第一个孩子。如果子元素有孩子,请重复1
否则什么也不做

只有最后一个子(叶)可选

回答

-1

什么对树状捕捉选择项事件并展开所选项目的第一个孩子?这似乎很容易做到。

1

UPDATE
想出一个更好的方法来做到这一点。这也将解释ObservableCollection中的变化。

XAML中可以只是看起来像这样

<Window.Resources> 
    <HierarchicalDataTemplate x:Key="Level1" 
           ItemsSource="{Binding Path=Childs}"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
</Window.Resources> 
<TreeView ItemsSource="{Binding}" 
      ...> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> 
      <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

然后我们处理IsSelected属性在模型/视图模型来代替。

public class MyViewModel : INotifyPropertyChanged 
{ 
    private static MyViewModel s_lastSelectedTestItem = null; 

    public MyViewModel(string name) 
    { 
     Name = name; 
     m_isSelected = false; 
     Childs = new ObservableCollection<MyViewModel>(); 
     Childs.CollectionChanged += new NotifyCollectionChangedEventHandler(TestItems_CollectionChanged); 
    } 

    void TestItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (IsSelected == true && Childs.Count > 0) 
     { 
      Childs[0].IsSelected = true; 
      IsExpanded = true; 
     } 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 
    public ObservableCollection<MyViewModel> Childs 
    { 
     get; 
     set; 
    } 

    private bool m_isSelected; 
    public bool IsSelected 
    { 
     get 
     { 
      return m_isSelected; 
     } 
     set 
     { 
      m_isSelected = value; 
      if (m_isSelected == true) 
      { 
       if (s_lastSelectedTestItem != null) 
       { 
        s_lastSelectedTestItem.IsSelected = false; 
       } 
       s_lastSelectedTestItem = this; 
       if (Childs.Count > 0) 
       { 
        IsExpanded = true; 
        Childs[0].IsSelected = true; 
        m_isSelected = false; 
       } 
      } 
      OnPropertyChanged("IsSelected"); 
     } 
    } 

    private bool m_isExpaned; 
    public bool IsExpanded 
    { 
     get 
     { 
      return m_isExpaned; 
     } 
     set 
     { 
      m_isExpaned = value; 
      OnPropertyChanged("IsExpanded"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
}