UWP: Aktualisierung der Benutzeroberfläche über Datenbindung von einem hintergrund-thread

Ich bin mit x:Bind (zusammengestellt verbindlich) in meine UWP-app binden Sie einen TextBlock, der auf eine integer-Eigenschaft im ViewModel die in einen string konvertiert, indem ein Wert Konverter. Ich bin mit einer Methode im ViewModel auf der worker-thread, um die Eigenschaften festzulegen, und rufen Sie das PropertyChanged-Ereignis. Allerdings bin ich immer eine Ausnahme (speziell, es ist in der XamlBindingSetters Klasse in die MainPage.g.cs-Datei) und Sie sagen: "Die aufgerufene Applikation eine Schnittstelle gemarshallt wurde für einen anderen thread." Nach diesem post, das sollte gut funktionieren in WPF; hat diese einfache Funktionalität wurde entfernt in WinRT/UWP oder mache ich etwas falsch?

Hier ist genau das, was ich Tue.

Mein Eigentum ist wie folgt definiert:

private int myProperty;

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

Die Set-Methode ist Teil der Vorlage 10-Bibliothek und ist 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 von dem, was ich sehen kann; es macht einfach sicher, dass der neue Wert anders ist als der alte Wert und ruft dann RaisePropertyChanged(propertyName) was macht Sie sicher, dass die app tatsächlich ausgeführt wird (nicht im Entwurfsmodus) und dann wirft das PropertyChanged-Ereignis.

Ich meine Immobilie von einem worker-thread:

MyProperty = newValue;

und wenn es um den XamlBindingSetters Klasse:

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

bricht es auf die Letzte Zeile (obj.Text = ...) und sagt mir, dass die Anwendung eine Schnittstelle, die wurde vorgebracht, die für einen anderen thread. Was mache ich falsch?

Sie sind die Aktualisierung der Benutzeroberfläche aus dem falschen thread. Sehen Sie, diese Frage für eine Antwort stackoverflow.com/questions/10579027/...
Okay, danke. Ich hatte gehofft, dass es würde automatisch erfolgen wie in WPF, aber es ist nicht schwer zu implementieren selbst.

InformationsquelleAutor Owen D. | 2015-09-19

Schreibe einen Kommentar