我需要像这样的Wpf树视图

时间:2010-10-13 12:33:46

标签: wpf treeview

ViewModel有2个字段。 NameChilds

我需要这样

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

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

2 个答案:

答案 0 :(得分:1)

<强>更新
想出一个更好的方法来做到这一点。这也将解释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>

然后我们在Model / ViewModel中处理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));
        }
    }
}

答案 1 :(得分:-1)

如何捕获树视图上的选择项目事件并展开所选项目的第一个子项?这似乎很容易。