代码之家  ›  专栏  ›  技术社区  ›  Owen D.

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

  •  0
  • Owen D.  · 技术社区  · 9 年前

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

    这正是我在做的。

    我的属性定义如下:

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

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

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

    从我所能看到的情况来看,没有什么问题;它只是确保新值与旧值不同,然后调用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=…)中断,并告诉我应用程序调用了为不同线程编组的接口。我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Community Dai    7 年前

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

    典型用法:

    obj.Invoke((MethodInvoker) SomeMethod);
    

    看见 How to Use ISynchronizeInvoke interface?

    enter image description here