WPF TreeView Databinding لإخفاء/عرض أيقونة توسيع/انهيار
-
28-09-2019 - |
سؤال
لقد قمت بتطبيق 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
منشأه. أم هل فاتني شيء؟