0

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

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

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

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

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

任何想法?

4

1 回答 1

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每次实现或虚拟化项目时设置属性...不过我必须警告您...这是很多工作。

于 2013-08-30T08:38:08.117 回答