WPF TreeView ملزم بـ ObservableCollection عدم تحديث العقد الجذرية
-
22-09-2019 - |
سؤال
آسف - سؤالي متطابق تقريبًا هذا ولكن نظرًا لأنها لم تتلقى إجابة قابلة للحياة ، آمل أن يكون لدى شخص آخر بعض الأفكار الجديدة.
لدي WPF TreeView مرتبط بتسلسل هرمي لنوع واحد:
public class Entity
{
public string Title { get; set; }
public ObservableCollection<Entity> Children { get; set; }
}
تقوم فئة الكيان بتنفيذ InotifyPropertyChanged ، لكنني حذفت هذا الرمز من أجل الوضوح.
يرتبط TreeView بـ ObservableCollectionu003CEntity> وكل حالة كيان تكشف مجموعة من مثيلات الكيان المحتوية عبر ممتلكات أطفالها:
<TreeView ItemsSource="{Binding Path=Entities}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Entity}" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Title}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
في البداية ، يرتبط TreeView كما هو متوقع ويعرض بشكل صحيح تسلسل هرمي متعدد المستويات. أيضًا ، عندما يتم تعديل عضوية إحدى مجموعات الأطفال برمجيًا ، تنعكس التغييرات بشكل صحيح في TreeView.
ومع ذلك ، التغييرات في عضوية مستوى عضو الجذر ObserableCollectionu003CEntity> لا تنعكس في TreeView.
سيكون موضع تقدير أي اقتراحات.
شكرا يا تيم
المحلول
تخميني الأولي هو أن لديك شيء مثل ما يلي لعقدة الجذر:
public ObservableCollection<Entity> Entities
{
get;
set;
}
ثم ، بدلاً من فعل شيء جيد مثل ما يلي:
Entities.Clear();
foreach (var item in someSetOfItems)
Entities.Add(item);
أنت تفعل شيئًا [سيئًا] مثل هذا:
Entities = new ObservableCollection<Entity>(someSetOfItems);
يجب أن تكون قادرًا على تعقب المشكلة عن طريق جعل مجال دعم خاصية الكيانات readonly
:
private readonly ObservableCollection<Entity> _entities
= new ObservableCollection<Entity>();
public ObservableCollection<Entity> Entities
{
get
{
return _entities;
}
}
نصائح أخرى
شرح إضافي ، وقت طويل للإجابة ، لكنني أعتقد أنه إذا قمت بالربط في XAML ، ثم في الكود ، قم بتعيين كائن جديد للخاصية التي تقوم بتكسيرها ، لذلك يجب عليك إعادة الربط في الكود لذلك للعمل. وبالتالي الحل مع حقل الدعم القراءة. إذا كنت تفعل مثل ذلك ، فلن تتمكن من تعيين ObservableCollection جديد ولن تقوم بتقسيم الربط عن طريق تعيين كائن جديد إلى حقل الدعم.