一个不可能的WPF DataBinding场景?

时间:2012-10-14 11:39:42

标签: .net wpf data-binding user-interface listbox

我首先开始使用WPF的主要原因是对数据绑定的所有可能性的承诺。经过几天的头痛,我开始认为最常见的场景之一是不可能的,我很想被证明是错的! :)

  • 我有一个ListBox,它将我的自定义类的实例作为ListItems。
  • 我的类通过实现一些DependencyProperties来准备DataBinding。
  • 我的ListBox有一个自定义的DataTemplate,可以很好的布局显示这些属性。
  • ListBox将ItemsSource设置为ObservableCollection<MyClass>
  • 列表框可能需要显示数百甚至数千个项目,以便维护响应式用户界面,需要在后台实例化

事实证明,在后台线程中创建我的类的实例是不可能的,并且只要它们是DependencyObjects,就可以将它们添加到UI线程中的ObservableCollection(或者直接到列表框,当我们省略ItemsSource时)。它引发了一个例外

  

必须在与DependencyObject相同的线程上创建DependencySource

我如何在WPF中处理这样的场景?根本不使用DP并使用INotifyPropertyChanged?当他们需要这样做时,人们实际上做了什么?我认为这是一个相当常见的场景,如果你输入“Magenta”,大多数DataBinding相关文章都会对改变TextBox背景颜色的可能性感到沮丧......:)

2 个答案:

答案 0 :(得分:2)

在实现或扩展控件时,我只会实现依赖项属性。在I中绑定的所有数据都只使用INotifyPropertychanged。看看Josh Smith's MVVM pattern article,这就是为我澄清了很多这一点。

此外,在迈向更加异步的模式时,最近我使用ReactiveUI,因为它在模式中也包含了很多异步命令。

答案 1 :(得分:2)

您可以改为使用INotifyPropertyChanged(我have recommended),也可以创建对象Freezable并在创建后冻结它们,或者您可以将对象的创建细分为不同的步骤或组,并在单独的调度程序消息中执行每个步骤。例如,以10个为一组创建对象,并在其自己的优先级较低的调度程序消息中执行每个操作。