Pregunta

I implementó un WPF TreeView load-on-demand como se describe en este (muy bien) artículo. En la solución mencionada un elemento ficticio se usa para preservar el comportamiento ampliar elemento + icono / TreeView. El elemento ficticio se sustituye con datos reales, cuando el usuario hace clic en el expansor.

Quiero perfeccionar el modelo mediante la adición de un public bool HasChildren { get { ... } } propiedad a mi TreeNodeViewModel respaldo.

Pregunta:
¿Cómo puedo unen esta propiedad para ocultar / mostrar el icono de ampliar (en XAML)? No soy capaz de encontrar una combinación de gatillo / definidor adecuado.
(INotifyPropertyChanged se implementa correctamente.)

Gracias por su tiempo.

Actualización 1:
Quiero usar mi propiedad public bool HasChildren en lugar de utilizar el elemento postizo.
La determinación de si o no un elemento tiene hijos es algo costoso, pero aún mucho más barato que ir a buscar a los niños.

¿Fue útil?

Solución

Julian,

esta es una muy buena pregunta. ¿Por qué no intenta escribir su propio elemento de vista de árbol? :) Quiero decir, no desde el principio, simplemente se derivan de TreeViewItem existente y añadir a su propiedad. He preparado una muestra rápida, pero no dude en modificarlo como desee (y pregunte si hay algo que no está muy claro). aquí vamos:

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);
        }

    }
}

Este fue el código de su encargo TreeViewItem. Ahora vamos a utilizar en 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>

Como se puede ver, el primer artículo es una normal y la segunda es su ser personalizado. Tenga en cuenta, que tiene un hijo. A continuación, se puede unir HasChildren propiedad a un objeto de Boole en su modelo de vista o simplemente probar mi clase personalizada mediante el establecimiento de HasChildren a false de código detrás de lo anterior XAML:

xyz.HasChildren = false;

Ahora, a pesar de su elemento tiene un hijo, ampliar no se muestra el botón, lo que significa, que mis obras de clases personalizadas.

Espero que te ayudé, pero no dude en preguntar si tiene alguna pregunta.

Piotr.

Otros consejos

Después de buscar rápidamente en código de Josh, me encontré con este constructor:

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

    _children = new ObservableCollection<TreeViewItemViewModel>();

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

Por lo tanto, si pasa false para el parámetro lazyLoadChildren de sus clases ViewModel que heredan, el icono + no debe aparecer porque no se añade la DummyChild. Ya que parece saber si sus artículos tienen hijos o no, usted debe ser capaz de pasar el valor apropiado para la propiedad lazyLoadChildren. O me estoy perdiendo algo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top