@pcinfogmach כתב בהאצת TreeView ב-WPF על ידי וירטואליזציה עצמית:
public static class TreeItemVirtualizationBehavior { public static bool GetEnableVirtualization(DependencyObject obj) => (bool)obj.GetValue(EnableVirtualizationProperty); public static void SetEnableVirtualization(DependencyObject obj, bool value) => obj.SetValue(EnableVirtualizationProperty, value); public static readonly DependencyProperty EnableVirtualizationProperty = DependencyProperty.RegisterAttached("EnableVirtualization", typeof(bool), typeof(TreeItemVirtualizationBehavior), new PropertyMetadata(false, OnEnableVirtualizationChanged)); private static void OnEnableVirtualizationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var item = (TreeViewItem)d; if ((bool)e.NewValue) { item.Expanded += setSource; item.Collapsed += setSource; item.Loaded += setSource; } else { item.Expanded -= setSource; item.Collapsed -= setSource; item.Loaded -= setSource; } } public static Func<object, bool> needPlaceHolders = (s) => false; private static void setSource(object sender, RoutedEventArgs e) { var treeViewItem = (TreeViewItem)sender; if (needPlaceHolders(treeViewItem.DataContext)) treeViewItem.ItemsSource = Enumerable.Repeat("", 1); } }כמו"כ אשמח לשמוע רעיונות איך להפוך את זה למשהו יותר כללי (כרגע הוא מגבל לסוג datacontext מסויים מאוד.
צריך להפוך לספציפי בטעינת האפליקציה על ידי השמה של needPlaceHolders:
TreeItemVirtualizationBehavior.needPlaceHolders = (dataContext) => dataContext is TreeItem treeItem && treeItem.Items?.Any() == true;יש מצב שלא הבנתי מה שהקוד צריך לעשות ואם ככה שטעיתי גם בהצעה.