UWP: Aktualisierung der Benutzeroberfläche durch Datenbindung von einem Hintergrundthread

Ich verwende x: Bind (kompilierte Bindung) in meiner UWP-App, um einen TextBlock an eine Ganzzahleigenschaft im ViewModel zu binden, die von einem Wertekonverter in einen String konvertiert wird. Ich verwende eine Methode im ViewModel für den Arbeitsthread, um die Eigenschaften festzulegen und das PropertyChanged-Ereignis aufzurufen. Es wird jedoch eine Ausnahme angezeigt (insbesondere in der XamlBindingSetters-Klasse in der MainPage.g.cs-Datei): "Die Anwendung hat eine Schnittstelle aufgerufen, die für einen anderen Thread gemarshallt wurde."According to this post, dies sollte in WPF gut funktionieren; Wurde diese einfache Funktionalität in WinRT / UWP entfernt oder mache ich etwas falsch?

Hier ist genau was ich tue.

Meine Eigenschaft ist wie folgt definiert:

private int myProperty;

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

Die Set-Methode ist Teil der Template 10-Bibliothek und definiert:

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

Nichts falsch da was ich sehen kann; Es wird lediglich sichergestellt, dass sich der neue Wert vom alten Wert unterscheidet, und anschließend wird RaisePropertyChanged (propertyName) aufgerufen, wodurch sichergestellt wird, dass die App tatsächlich ausgeführt wird (nicht im Entwurfsmodus). Anschließend wird das PropertyChanged-Ereignis ausgelöst.

Ich habe meine Eigenschaft in einem Arbeitsthread festgelegt:

MyProperty = newValue;

und wenn es um die XamlBindingSetters-Klasse geht:

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

it bricht in der letzten Zeile (obj.Text = ...) ab und teilt mir mit, dass die Anwendung eine Schnittstelle aufgerufen hat, die für einen anderen Thread gemarshallt wurde. Was mache ich falsch

Antworten auf die Frage(2)

Ihre Antwort auf die Frage