@pcinfogmach כתב בהאצת TreeView ב-WPF על ידי וירטואליזציה עצמית:
כמו"כ אשמח לשמוע רעיונות איך להפוך את זה למשהו יותר כללי (כרגע הוא מגבל לסוג datacontext מסויים מאוד.
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);
}
}
צריך להפוך לספציפי בטעינת האפליקציה על ידי השמה של needPlaceHolders:
TreeItemVirtualizationBehavior.needPlaceHolders = (dataContext) =>
dataContext is TreeItem treeItem && treeItem.Items?.Any() == true;
יש מצב שלא הבנתי מה שהקוד צריך לעשות ואם ככה שטעיתי גם בהצעה.