سؤال

لقد قمت بتطبيق WPF Load-On-Demand Treeview كما هو موضح في هذه (جيد جدا) مقال. في الحل المذكور ، يتم استخدام عنصر وهمية للحفاظ على التوسيع + أيقونة / TreeView السلوك عنصر. يتم استبدال العنصر الوهمي ببيانات حقيقية ، عندما ينقر المستخدم على الموسع.

أريد تحسين النموذج عن طريق إضافة خاصية public bool HasChildren { get { ... } } لدعم بلدي TreeNodeViewModel.

سؤال:
كيف يمكنني ربط هذه الخاصية لإخفاء/إظهار أيقونة التوسيع (في XAML)؟ أنا غير قادر على العثور على مجموعة مناسبة/مجموعة مناسبة.
(يتم تنفيذ inotifyPropertyChanged بشكل صحيح.)

شكرا على وقتك.

تحديث 1:
أريد استخدام الممتلكات الخاصة بي public bool HasChildren في حين أن من استخدام العنصر الوهمية.
إن تحديد ما إذا كان عنصر ما لديه أطفال مكلف إلى حد ما ، ولكنه لا يزال أرخص بكثير من جلب الأطفال.

هل كانت مفيدة؟

المحلول

جوليان ،

هذا السؤال حقا جيد. لماذا لا تحاول كتابة عنصر عرض الشجرة الخاص بك؟ :) أعني ، ليس من الخدش ، فقط استمد من 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>

كما ترون ، العنصر الأول هو العنصر العادي والثاني هو العنصر المخصص الخاص بك. يرجى ملاحظة أن لديها طفل واحد. بعد ذلك ، يمكنك الربط لديها اطفال خاصية لبعض الكائنات المنطقية في ViewModel الخاص بك أو ما عليك سوى اختبار فصلي المخصص عن طريق إعداد Haschildren خطأ شنيع من الكود وراء XAML أعلاه:

xyz.HasChildren = false;

الآن ، على الرغم من أن العنصر الذي يحتوي على طفل واحد ، لا يتم عرض زر التوسع ، لذلك يعني أن فصلي المخصص يعمل.

آمل أن أكون قد ساعدتك ، لكن لا تتردد في طرح ما إذا كان لديك أي أسئلة.

بيوتر.

نصائح أخرى

بعد النظر بسرعة في رمز جوش ، وجدت هذا المُنشئ:

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

    _children = new ObservableCollection<TreeViewItemViewModel>();

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

لذلك ، إذا مررت false ل lazyLoadChildren المعلمة من فئات ViewModel الموروثة ، يجب ألا تظهر أيقونة + لأنه لم يتم إضافة DummyChild. نظرًا لأنك تعرف ما إذا كانت العناصر الخاصة بك لديها أطفال أم لا ، يجب أن تكون قادرًا على تمرير القيمة المناسبة لـ lazyLoadChildren منشأه. أم هل فاتني شيء؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top