C# 虚拟化集合项容器一致性

C# 虚拟化集合项容器一致性,c#,wpf,virtualization,C#,Wpf,Virtualization,我正在实现一个自定义的多选择树视图。此控件继承自项控件,多选树视图项继承自树视图项。 由于有大量的数据集,我想绑定到这个控件,所以我使用VirtualizationStackPanel作为它的主机 我将TreeViewItems IsSelectedprop绑定到ViewModelClassIsSelected属性。 当我在树中向下滚动时,所选项目将离开视口,IsSelected属性设置为false(由于虚拟化,MultiSelectionTreeViewItems与树断开连接)。当我向后滚动时

我正在实现一个自定义的
多选择树视图
。此控件继承自
项控件
多选树视图项
继承自
树视图项
。 由于有大量的数据集,我想绑定到这个控件,所以我使用
VirtualizationStackPanel
作为它的主机

我将
TreeViewItems IsSelected
prop绑定到ViewModelClass
IsSelected
属性。 当我在树中向下滚动时,所选项目将离开视口,
IsSelected
属性设置为false(由于虚拟化,MultiSelectionTreeViewItems与树断开连接)。当我向后滚动时,将创建一个新的项目容器(MultiSelectionTreeViewItem),并根据ViewModel将该容器的IsSelected属性设置为true

现在我无法确定所选事件的发生是因为容器项从视口中传出/返回,还是因为模型或viewmodel层中发生了更改

更糟糕的是,我无法设置断开连接项目的IsSelected属性。例如,通过向下滚动,对更多项目使用Shift选择

我无法访问控件实现中的viewmodel类


有什么想法吗?

如果您创建一个自定义的虚拟化实现,就可以解决这个问题。碰巧的是,我找到了一个链接,指向我在网上以PDF格式购买的一本书。这本书有一个关于虚拟化的伟大章节(第8章)

虽然我已经使用这些信息实现了自己的虚拟化面板,但我不得不说这相当复杂。但是,如果确实实现了自己的系统,则可以向视图模型对象添加另一个特性:

public bool IsRealized { get; set; }
“已实现”项是实际可见的项,而不是仅驻留在内存中的“虚拟化”项。因此,使用此属性,您可以调整
IsSelected
属性,使其仅在
IsRealized
属性为
true
时才作出反应:

public bool IsSelected
{ 
    get { return isSelected; }
    set { if (IsRealized) { isSelected = value; NotifyPropertyChanged("IsSelected"); }
}

然后,在自定义虚拟化面板中,您可以在每次实现或虚拟化项目时设置
IsRealized
属性。。。不过我得警告你。。。这将需要大量的工作。

我将使用snoop并检查该值是作为“本地”还是“绑定”给出的,其中绑定值高亮显示为绿色。