Canvas上的ListBox:覆盖多个画布或使用CompositeCollection?

时间:2014-02-12 15:45:12

标签: wpf canvas compositecollection

在带有mvvm的wpf中,我使用带有Canvas的ListBox作为ItemsPanelTemplate和DataTemplates来自定义外观。
我想通过首先将所有类型1的项目添加到绘图中,然后添加类型2的所有项目来提高性能 我可以使用Canvas作为ItemsPanelTemplate创建两个ListBox,它们将是叠加 可以通过绑定来同步平移和滚动 通过这种方式,我可以相互独立地为两个列表提升PropertyChanges。

问题:您是否有经验覆盖画布的性能好坏?

我不确定是否也可以使用CompositeCollection为一个ListBox的ItemsSource。或者就此而言,给两种类型一个共同的子类,并使用ObservableCollection。

问题:您是否认为具有CompositeCollection的列表可以为Collection的不同部分提供单独的PropertyChanges?

编辑:
假设我有很多用于画布的点,线,标签,每种都有不同类型,但是有一个共同的基本类型。我使用DataType选择DataTemplate:DataType="{x:Type my:Point}"DataType="{x:Type my:Line}"等 首先,我希望用户能够看到线条。我引出PropertyChanged("Lines")并且可以看到行的ListBox + Canvas 在后台工作者中,我引发了PropertyChanged("Points"),并且可以看到ListBox2 + Canvas2的点数 当我在另一个背景工作者中完成时,我会引发PropertyChanged("Labels"),并且可以看到标签的ListBox3 + Canvas3。

1 个答案:

答案 0 :(得分:2)

使用基本的面向对象编程有一个更简单的解决方案。创建基本数据类型并使所有数据对象从中扩展。它可能是空的,但如果没有别的,你可以在其中实现INotifyPropertyChanged,所以你不必在其他每种数据类型中。

然后,您只需将类型为ObservableCollection<BaseClass>的属性添加到视图模型或代码后面,将 数据绑定到ListBox.ItemsSource属性。只要您在不同的x:Key上设置DataTemplate值,WPF就会在呈现它们时隐式将它们设置为相关的数据类型对象。 / p>

因此,您可以将所有的不同数据类型放在同一个集合中。然后你可以添加你的第一个类型并等待很长时间并添加一些不同的类型,或者你想要的任何顺序。


更新&gt;&gt;&gt;

为了回答你的问题中的编辑,我不太明白你试图使用INotifyPropertyChanged界面显示项目的原因,按类型输入。如果你有我上面提到的基类集合,那么你只需先将第一种类型的实例添加到集合中,这样它们就会首先出现。当您想要显示下一个类型时,只需将它们添加到集合中,然后它们就会出现,依此类推。 ObservableCollection会照顾到这一点。