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 = ...) и говорит мне, что приложение вызвало интерфейс, который был назначен для другого потока. Что я делаю неправильно?