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?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie benötigen, um ausführen alle grafischen Objekte in der UI-Thread.
Erste Lösung, mit MVVM Light Rahmen.
sehen Einfaches Beispiel DispatcherHelper
Zweite Lösung, mit ISynchronizeInvoke.
Typische Verwendung:
Sehen Wie zu Verwenden ISynchronizeInvoke-Schnittstelle?
OK... Also, stellen Sie die Frage als gelöst.
MvvmLight? Verwenden Sie einfach
Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher.RunAsync
zu nennen, den 2. param-Funktion im UI-thread und du bist fertig. Keine Notwendigkeit, einen Rahmen zu schaffen, nur umschließt dieser code 😉Ja, aber das DispatcherHelper - Klasse (von MVVM Light) ist eine Hilfsklasse, die für dispatcher-Operationen im UI-thread... für mehrere projets: WPF, Univeral Apps, Phone, Xamarin für Android, Xamarin für iOS, etc.
Ich konnte nicht Referenz ISynchronizeInvoke, wenn ich es versucht habe. Existiert Sie überhaupt in der UWP?
InformationsquelleAutor Denis Voituron