C# 虚拟化集合项容器一致性
我正在实现一个自定义的C# 虚拟化集合项容器一致性,c#,wpf,virtualization,C#,Wpf,Virtualization,我正在实现一个自定义的多选择树视图。此控件继承自项控件,多选树视图项继承自树视图项。 由于有大量的数据集,我想绑定到这个控件,所以我使用VirtualizationStackPanel作为它的主机 我将TreeViewItems IsSelectedprop绑定到ViewModelClassIsSelected属性。 当我在树中向下滚动时,所选项目将离开视口,IsSelected属性设置为false(由于虚拟化,MultiSelectionTreeViewItems与树断开连接)。当我向后滚动时
多选择树视图
。此控件继承自项控件
,多选树视图项
继承自树视图项
。
由于有大量的数据集,我想绑定到这个控件,所以我使用VirtualizationStackPanel
作为它的主机
我将TreeViewItems IsSelected
prop绑定到ViewModelClassIsSelected
属性。
当我在树中向下滚动时,所选项目将离开视口,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并检查该值是作为“本地”还是“绑定”给出的,其中绑定值高亮显示为绿色。