Frage

implementiert ich einen WPF-load-on-Demand-treeview wie beschrieben in diesen (sehr gut) Artikel. In der genannten Lösung wird ein Dummy-Element verwendet, um das erweitern + Symbol / treeview Element Verhalten zu bewahren. Das Dummy-Element wird mit realen Daten ersetzt, wenn der Benutzer klickt auf dem Expander.

Ich mag das Modell verfeinern, indem eine Eigenschaft public bool HasChildren { get { ... } } meine Unterstützung TreeNodeViewModel hinzuzufügen.

Frage:
Wie kann ich binden diese Eigenschaft auf hide / show das Symbol (in XAML) erweitern? Ich bin nicht in der Lage einen geeigneten Trigger / Setter Kombination zu finden.
(INotifyPropertyChanged richtig umgesetzt wird.)

Vielen Dank für Ihre Zeit.

Update 1:
Ich möchte mein Eigentum public bool HasChildren verwenden statt des Dummy-Element verwendet.
Die Bestimmung, ob ein Artikel Kinder hat, ist etwas teuer, aber immer noch viel billiger als die Kinder zu holen.

War es hilfreich?

Lösung

Julian,

Dies ist eine wirklich gute Frage. Warum versuchen Sie nicht Ihre eigene Baumansicht Artikel zu schreiben? :) Ich meine, nicht aus dem Grunde, leiten nur aus bestehenden TreeViewItem und Ihren Betrieb hinzuzufügen. Ich habe eine kurze Probe vorbereitet, aber ich fühle mich frei, es zu ändern, wie Sie wollen (und Fragen stellen, wenn etwas nicht ganz klar ist). hier gehen wir:

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

    }
}

Dies war der Code für die benutzerdefinierte TreeViewItem. Nun lassen sie es in XAML verwenden:

<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>

Wie Sie sehen können, erste Element ist eine reguläre und die zweite ist Ihre individuelle ein. Bitte beachten Sie, dass es ein Kind hat. Als nächstes können Sie binden HasChildren Eigenschaft zu einem gewissen Boolean-Objekt in Ihrem Ansichtsmodell oder einfach nur durch meine benutzerdefinierte Klasse testet HasChildren auf False aus dem Code hinter den oben XAML Einstellung:

xyz.HasChildren = false;

Nun, trotz Ihres Element ein Kind hat, erweitert Schaltfläche nicht angezeigt wird, so bedeutet dies, dass meine benutzerdefinierte Klasse funktioniert.

Ich hoffe, dass ich Ihnen geholfen, aber das Gefühl frei zu fragen, ob Sie irgendwelche Fragen haben.

Piotr.

Andere Tipps

Nach dem schnell ein Blick in Joshs Code, fand ich diesen Konstruktor:

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

    _children = new ObservableCollection<TreeViewItemViewModel>();

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

Wenn Sie also false für den lazyLoadChildren Parameter von Ihren vererben Ansichtsmodell Klassen übergeben, sollte das + Symbol nicht angezeigt, da der DummyChild wird nicht hinzugefügt. Da Sie scheinen zu wissen, ob Ihre Artikel Kinder haben oder nicht, sollten Sie den entsprechenden Wert für die lazyLoadChildren Eigenschaft passieren können. Oder bin ich etwas fehlt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top