虚拟化集合项容器一致性

时间:2013-08-30 08:13:26

标签: c# wpf virtualization

我正在实施自定义MultiSelectionTreeView。此控件继承自ItemsControlMultiSelectionTreeViewItem继承自TreeViewItem。 由于数据集庞大,我想绑定到这个控件,我使用VirtualizationStackPanel作为主机。

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

现在我无法确定是否发生了选定事件,因为容器项目已从/返回到视口,或者模型或视图模型层发生了更改。

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

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

有什么想法吗?

1 个答案:

答案 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属性...我必须警告您,但成为很多工作。