0

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

问题:您是否体验过覆盖画布对性能的好处或坏处?

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

问题:您是否认为可以为 Collection 的不同部分以某种方式为具有 CompositeCollection 的列表提供单独的 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 是可见的。

4

1 回答 1

2

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

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

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


更新>>>

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

于 2014-02-12T21:59:52.307 回答