Мне нужен вид дерева Wpf, как это - PullRequest
4 голосов
/ 13 октября 2010

ViewModel имеет 2 поля.Name, Childs

Мне нужно вот так

1.При нажатии на корневой элемент, сделайте 2 операцииfirst.расширить себяsecond.выберите первого ребенка.Если дочерний элемент имеет дочерние элементы, повторите 1.в противном случае ничего не делать

Можно выбрать только последний дочерний элемент (лист)

Ответы [ 2 ]

1 голос
/ 16 октября 2010

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 в Model / ViewModel.

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));
        }
    }
}
0 голосов
/ 13 октября 2010

Как насчет захвата события select item в древовидной структуре и расширения первого дочернего элемента выбранного элемента? Кажется, это легко сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...