我正在实施自定义MultiSelectionTreeView
。此控件继承自ItemsControl
,MultiSelectionTreeViewItem
继承自TreeViewItem
。
由于数据集庞大,我想绑定到这个控件,我使用VirtualizationStackPanel
作为主机。
我将TreeViewItems IsSelected
道具绑定到ViewModelClass IsSelected
属性。
当我在树中向下滚动时,所选项目退出视口,并且IsSelected
属性设置为false(因为MultiSelectionTreeViewItems与树断开连接的虚拟化)。当我向后滚动时,会创建一个新项目容器(MultiSelectionTreeViewItem),并根据ViewModel将该项目的IsSelected prop设置为true。
现在我无法确定是否发生了选定事件,因为容器项目已从/返回到视口,或者模型或视图模型层发生了更改。
更糟糕的是,我无法设置断开连接项的IsSelected属性。例如,使用Shift选项可以向下滚动更多项目。
我无法访问控件实现中的viewmodel类。
有什么想法吗?
答案 0 :(得分:0)
如果您创建虚拟化的自定义实现,则可以解决此问题。事实上,我找到了一本书,我在网上用PDF购买了这本书。本书有一篇关于虚拟化的章节(第8章)...... WPF Control Development Unleashed。
虽然我已经使用这些信息实现了自己的虚拟化面板,但我不得不说它相当复杂。但是,如果您实现了自己的系统,则可以向视图模型对象添加另一个属性:
public bool IsRealized { get; set; }
'已实现'项目是实际可见的项目,而不是仅驻留在内存中的“虚拟化”项目。因此,使用此属性,您可以调整IsSelected
属性,仅在IsRealized
属性为true
时作出反应:
public bool IsSelected
{
get { return isSelected; }
set { if (IsRealized) { isSelected = value; NotifyPropertyChanged("IsSelected"); }
}
然后在您的自定义虚拟化面板中,您可以在每次实现或虚拟化项目时设置IsRealized
属性...我必须警告您,但将成为很多工作。