首页 文章

一个不可能的WPF DataBinding场景?

提问于
浏览
0

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

  • 我有一个ListBox,它将我的自定义类的实例作为其ListItems .

  • 我的类通过实现一些DependencyProperties来准备DataBinding .

  • 我的ListBox有一个自定义的DataTemplate,可以在一个漂亮的布局中显示这些属性 .

  • ListBox将ItemsSource设置为 ObservableCollection<MyClass>

  • 列表框可能需要显示数百甚至数千个项目,以便维护响应式用户界面 they need to be instantiated in the background .

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

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

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

2 回答

  • 2

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

  • 2

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

    此外,在朝着更加异步的模式发展的过程中,最近我使用了ReactiveUI,因为它在模式中也包含了很多异步命令 .

相关问题