ViewModel 有 2 个字段。 Name , Childs
我需要这样
1 。当点击根元素时,做2个操作first 。扩展自己second 。选择第一个 child 。如果子元素有子元素,请重复 1
否则什么都不做

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

最佳答案

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

关于wpf - 我需要这样的 Wpf 树 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3923640/

10-12 20:17