UWP: обновление пользовательского интерфейса через привязку данных из фонового потока

Я использую x: Bind (скомпилированное связывание) в своем приложении UWP для привязки TextBlock к целочисленному свойству в ViewModel, которое преобразуется в строку преобразователем значения. Я использую метод в ViewModel в рабочем потоке, чтобы установить свойства и вызвать событие PropertyChanged. Тем не менее, я получаю исключение (в частности, оно находится в классе XamlBindingSetters в файле MainPage.g.cs), говорящее: «Приложение вызвало интерфейс, который был назначен для другого потока».Согласно этому постуэто должно работать нормально в 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)

Ваш ответ на вопрос