WPF TreeView Data Datinging для скрытия / шоу расширяющую / коллапс значок

StackOverflow https://stackoverflow.com/questions/2668687

Вопрос

Я реализовал TreeView WPF нагрузки на потребность, как описано в это (Очень хорошая) статья. В упомянутом решении фиктивное элемент используется для сохранения расширения + Значок / дерево поведение предмета. Пунточный элемент заменен реальными данными, когда пользователь нажимает на расширитель.

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

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

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

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

Это было полезно?

Решение

Джулиан,

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

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. недвижимость в каком-то логическом объекте в вашем просмотру или просто просто проверить свой пользовательский класс, установив Haschildren в Ложь От кода за вышеуказанным XAML:

xyz.HasChildren = false;

Теперь, несмотря на ваш элемент имеет один ребенок, кнопка Expand не отображается, так что это означает, что мой пользовательский класс работает.

Я надеюсь, что помог тебе, но не стесняйтесь спрашивать, есть ли у вас какие-либо вопросы.

Piotr.

Другие советы

После быстрого взгляда в код Джоша, я нашел этот конструктор:

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

    _children = new ObservableCollection<TreeViewItemViewModel>();

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top