0

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

  • 我有一个 ListBox,它将我的自定义类的实例作为它的 ListItems。
  • 我的课程通过实现一些 DependencyProperties 准备好 DataBinding。
  • 我的 ListBox 有一个自定义的 DataTemplate 来以漂亮的布局显示这些属性。
  • ListBox 将 ItemsSource 设置为ObservableCollection<MyClass>
  • 列表框可能需要显示数百甚至数千个项目,因此为了保持响应式 UI,它们需要在后台实例化

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

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

我应该如何在 WPF 中处理这样的场景?根本不使用 DP 并使用 INotifyPropertyChanged?人们实际上在做什么,什么时候需要这样做?我认为这是一个相当常见的场景,我很不高兴大多数与 DataBinding 相关的文章都在谈论如果您输入“洋红色”则可能更改 TextBox 背景颜色... :)

4

2 回答 2

2

我只会在实现或扩展控件时实现依赖属性。我将简单地使用 INotifyPropertychanged 绑定的所有数据。看看Josh Smith 的 MVVM 模式文章,这为我澄清了很多。

此外,在朝着更加异步的模式发展的过程中,这些天我使用ReactiveUI,因为它也包含了许多模式中的异步命令。

于 2012-10-14T12:08:37.463 回答
2

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

于 2012-10-14T12:44:20.743 回答