Привязка данных WPF TreeView для скрытия / отображения значка развертывания / свертывания

Я реализовал древовидное представление WPF load-on-demand, как описано в this (очень хорошо ) статья. В упомянутом решении используется фиктивный элемент, чтобы сохранить поведение элемента Expand + icon / treeview. Фиктивный элемент заменяется реальными данными, когда пользователь нажимает на расширитель.

Я хочу уточнить модель, добавив свойство public bool HasChildren { get { ... } } к моей подложке TreeNodeViewModel.

Вопрос:
Как я могу привязать это свойство, чтобы скрыть / показать значок раскрытия (в XAML)? Я не могу найти подходящую комбинацию триггера / установщика.
(INotifyPropertyChanged реализован правильно.)

Спасибо за ваше время.

Обновление 1.
Я хочу использовать свое свойство public bool HasChildren вместо использования фиктивного элемента.
Определение наличия дочерних элементов у элемента обходится довольно дорого, но все же намного дешевле, чем получение дочерних элементов .


person Julian Lettner    schedule 19.04.2010    source источник


Ответы (2)


Джулиан,

это действительно хороший вопрос. Почему бы вам не попробовать написать свой собственный элемент древовидного представления? :) Я имею в виду, что не с нуля, просто унаследуйте от существующего TreeViewItem и добавьте свое свойство. Я подготовил небольшой образец, но не стесняйтесь изменять его по своему усмотрению (и задавайте вопросы, если что-то не совсем понятно). вот так:

public class TreeViewItem_CustomControl : TreeViewItem
{
    static TreeViewItem_CustomControl()
    {
        HasChildrenProperty = DependencyProperty.Register("HasChildren", typeof(Boolean), typeof(TreeViewItem_CustomControl));
    }

    static DependencyProperty HasChildrenProperty;

    public Boolean HasChildren
    {
        get
        {
            return (Boolean)base.GetValue(HasChildrenProperty);
        }

        set
        {
            if (value)
            {
                if (this.Items != null)
                {
                    this.Items.Add(String.Empty); //Dummy item
                }
            }
            else
            {
                if (this.Items != null)
                {
                    this.Items.Clear();
                }
            }

            base.SetValue(HasChildrenProperty, value);
        }

    }
}

Это был код для вашего пользовательского TreeViewItem. Теперь воспользуемся этим в XAML:

<TreeView>
    <TreeViewItem Header="qwer">
        Regulat tree view item.
    </TreeViewItem>
    <CustomTree:TreeViewItem_CustomControl x:Name="xyz" Header="temp header" Height="50">
        <TreeViewItem>Custom tree view item, which will be removed.</TreeViewItem>
    </CustomTree:TreeViewItem_CustomControl>
</TreeView>

Как видите, первый элемент является обычным, а второй - вашим индивидуальным. Обратите внимание, что у него есть один ребенок. Затем вы можете привязать свойство HasChildren к некоторому логическому объекту в вашей ViewModel или просто протестировать мой собственный класс, установив для HasChildren значение False из кода, стоящего за указанным выше XAML:

xyz.HasChildren = false;

Теперь, несмотря на то, что у вашего элемента есть один дочерний элемент, кнопка «Развернуть» не отображается, поэтому это означает, что мой настраиваемый класс работает.

Надеюсь, я помог вам, но не стесняйтесь спрашивать, есть ли у вас вопросы.

Петр.

person Piotr Justyna    schedule 21.04.2010

Быстро изучив код Джоша, я нашел этот конструктор:

protected TreeViewItemViewModel(TreeViewItemViewModel parent, bool lazyLoadChildren)
{
    _parent = parent;

    _children = new ObservableCollection<TreeViewItemViewModel>();

    if (lazyLoadChildren)
        _children.Add(DummyChild);
}

Итак, если вы передадите false для параметра lazyLoadChildren из наследуемых классов ViewModel, значок + не должен появиться, потому что DummyChild не добавлен. Поскольку вам кажется, что вы знаете, есть ли у ваших элементов дочерние элементы, вы должны иметь возможность передать соответствующее значение для свойства lazyLoadChildren. Или я что-то упускаю?

person gehho    schedule 19.04.2010