UWP: atualizando a interface do usuário através da ligação de dados de um encadeamento em segundo plano
Estou usando x: Bind (ligação compilada) no meu aplicativo UWP para vincular um TextBlock a uma propriedade inteira no ViewModel que é convertida em uma string por um conversor de valor. Estou usando um método no ViewModel no thread de trabalho para definir as propriedades e chamar o evento PropertyChanged. No entanto, estou recebendo uma exceção (especificamente, está na classe XamlBindingSetters no arquivo MainPage.g.cs) dizendo: "O aplicativo chamou uma interface que foi empacotada para um thread diferente".De acordo com este post, isso deve funcionar bem no WPF; Essa facilidade de funcionalidade foi removida no WinRT / UWP ou estou fazendo algo errado?
Aqui está exatamente o que estou fazendo.
Minha propriedade é definida assim:
private int myProperty;
public int MyProperty
{
get { return myProperty; }
set
{
Set(ref myProperty, value);
}
}
O método Set faz parte da biblioteca do Modelo 10 e está definido:
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;
}
Nada de errado lá, pelo que posso ver; apenas garante que o novo valor seja diferente do valor antigo e chama RaisePropertyChanged (propertyName), o que garante que o aplicativo esteja em execução (não no modo de design) e, em seguida, gera o evento PropertyChanged.
Defino minha propriedade a partir de um thread de trabalho:
MyProperty = newValue;
e quando chega à classe 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;
}
};
ele quebra nessa última linha (obj.Text = ...) e informa que o aplicativo chamou uma interface que foi empacotada para um thread diferente. O que estou fazendo errado?