UWP:通过后台线程的数据绑定更新UI

我在我的UWP应用程序中使用x:Bind(编译绑定)将TextBlock绑定到ViewModel中的整数属性,该属性由值转换器转换为字符串。 我在工作线程的ViewModel中使用一个方法来设置属性并调用PropertyChanged事件。 但是,我得到一个exception(具体来说,它位于MainPage.g.cs文件中的XamlBindingSetters类中),“应用程序调用了一个为不同线程编组的接口。” 根据这篇文章 ,这应该在WPF中运行得很好; 在WinRT / UWP中删除了这种易用性,还是我做错了什么?

这正是我正在做的事情。

我的属性定义如下:

private int myProperty; public int MyProperty { get { return myProperty; } set { Set(ref myProperty, value); } } 

Set方法是Template 10库的一部分,定义如下:

 public bool Set(ref T storage, T value, [CallerMemberName]string propertyName = null) { if (object.Equals(storage, value)) return false; storage = value; RaisePropertyChanged(propertyName); return true; } 

从我能看到的东西没有错; 它只是确保新值与旧值不同,然后调用RaisePropertyChanged(propertyName),确保应用程序实际运行(不在设计模式下),然后引发PropertyChanged事件。

我从一个工作线程设置我的属性:

 MyProperty = newValue; 

当它到达XamlBindingSetters类时:

 internal class XamlBindingSetters { public static void Set_Windows_UI_Xaml_Controls_TextBlock_Text(global::Windows.UI.Xaml.Controls.TextBlock obj, global::System.String value, string targetNullValue) { if (value == null && targetNullValue != null) { value = targetNullValue; } obj.Text = value ?? global::System.String.Empty; } }; 

它打破了最后一行(obj.Text = …)并告诉我该应用程序调用了一个为不同线程编组的接口。 我究竟做错了什么?

您需要在UI线程中执行所有图形对象。

  • 第一个解决方案,使用MVVM Light框架。

    请参阅DispatcherHelper的简单示例

  • 第二种解决方案,使用ISynchronizeInvoke

典型用法:

 obj.Invoke((MethodInvoker) SomeMethod); 

请参见如何使用ISynchronizeInvoke接口?

在此处输入图像描述