2012-01-08 79 views
4

如果你实现INotifyPropertyChanged,你可以在非UI线程中引发事件 - 我应该避免这种情况,为什么?不在UI线程中触发PropertyChanged的副作用是什么?

更新:这是关于绑定在wpf应用程序。

+0

您是否可以从非UI线程中successfully调用NotifyPropertyChanged?通过设计,只有创建UI对象的线程才能访问该对象。常见的用法是在后台创建昂贵的对象,然后在回调中(在UI上)绑定对象或调用NotifyPropertChanged。 – Paparazzi 2012-01-08 15:54:10

回答

4

不,你不应该避免这一点。 WPF将代表您的UI线程编组为PropertyChanged事件,但即使没有,也可能不是组件的责任。

更新:我稍微误解了你的问题。出于某种原因,我认为你是在具体询问与UI不直接相关的背景组件。

如果您的组件旨在供UI直接使用,那么对UI线程进行编组更改可能很有意义,例如使用Windows窗体。但是,如果组件与用户界面无关,通常不会有意义,但如果需要,可以使用当前的SynchronizationContext以不可知的方式切换到UI线程。

我会在需要时使用WPF进行编组,因为正如我通常所说的那样,您不需要WPF为您做。但是,如果您也在更改集合,那么您将需要,因为此类更改不会自动编组。

+1

在.NET 4.5中引入BindingOperations类具有静态EnableCollectionSynchronization方法,该方法允许您将锁对象与ObservableCollection(更确切地说是和IEnumerable实例)相关联。这会在绑定到itemssource时通知绑定机制在枚举过程中锁定(刷新视图内容)。因此,现在绑定到在非UI线程上更新的集合将不会成为问题(只要在更改或观察viewmodel内的集合时使用相同的锁定)。最后,我在视图模型中摆脱了Dispatcher。 – Frode 2013-10-04 08:43:55

0

如果您使用数据绑定,这可能会导致绑定框架遇到异常。例如,winforms绑定是而不是期望这样,并且通常会遇到麻烦。

虽然依赖于框架,也许(我gebuinely不知道),例如,WPF支持这一点。

+0

WPF确实支持这非常方便。 – 2012-01-08 12:31:20

相关问题