我首先开始使用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 回答
您可以使用
INotifyPropertyChanged
(因为我have recommended),或者您可以创建对象Freezable
并在创建后冻结它们,或者您可以将对象的创建分解为不同的步骤或组,并在单独的调度程序消息中执行每个步骤 . 例如,以10个为一组创建对象,并在其自己的优先级较低的调度程序消息中执行每个对象 .在实现或扩展控件时,我只会实现依赖项属性 . 在I中绑定的所有数据都只使用INotifyPropertychanged . 看看Josh Smith's MVVM pattern article,这就是为我澄清了很多这个 .
此外,在朝着更加异步的模式发展的过程中,最近我使用了ReactiveUI,因为它在模式中也包含了很多异步命令 .