切换到ShouldAlwaysRaiseInpcOnUserInterfaceThread(false)MVVMCross

时间:2017-05-10 08:29:57

标签: xamarin mvvmcross

我们正在从MVVMCross 4.1迁移到4.4。我们要考虑的主要事情之一是4.2中引入的MvxTaskBasedBindingContext。

MVVMCross 4.2 docs中说

  

要充分利用MvxTaskBasedBindingContext,您应该这样做   也调用ShouldAlwaysRaiseInpcOnUserInterfaceThread(false);在里面   ViewModel构造函数。

MvxTaskBasedBindingContext听起来像是一件好事,因此我们想要充分利用它。然而,不出所料,不再总是在UI线程上提升INotifyPropertyChanged给我们提供了大量的线程编组错误

应用程序称为为不同线程编组的接口

是否有建议的方法转移到ShouldAlwaysRaiseInpcOnUserInterfaceThread(false)模型,在某些情况下是否值得?

1 个答案:

答案 0 :(得分:0)

如果您查看MvxNotifyPropertyChanged中的implementation,则会发现RaisePropertyChanged默认将PropertyChanged事件编组到UI线程。

因此,如果您要对PropertyChanged事件执行单元测试,则它们可能会中断,因为没有Dispatcher。设置ShouldAlwaysRaiseInpcOnUserInterfaceThread(false)可以防止这种情况,并且加薪将直接在您当时所在的线程上进行。

当您故意在另一个线程中订阅PropertyChanged时,这也很方便。

如果需要,可以将其设置为false并在基本viewmodel类上创建要执行的方法:

this.InvokeOnMainThread(() => this.RaisePropertyChanged(propertyName));

因此,您始终使用RaisePropertyChangedOnMainThread(这样命名),并且不会发生线程编组错误。

来源:http://www.damirscorner.com/blog/posts/20140324-HandlingPropertyChangedEventInMvvmCrossViewModelUnitTests.html

HIH