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

时间:2015-09-19 18:18:35

标签: c# multithreading windows-runtime winrt-xaml uwp

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

这正是我正在做的事情。

我的属性定义如下:

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

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

MyProperty = newValue;

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

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

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;
        }
    };

当它到达XamlBindingSetters类时:

{{1}}

它在最后一行(obj.Text = ...)中断,并告诉我该应用程序调用了为不同线程编组的接口。我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

典型用法:

obj.Invoke((MethodInvoker) SomeMethod);

请参阅How to Use ISynchronizeInvoke interface?

enter image description here