Ich habe ein Problem mit einer Abhängigkeitseigenschaft.Dependency-Eigenschaft wird nicht aktualisiert, da sie in einem anderen Thread erstellt wurde
Ich habe eine ObservableCollection<myUsercontrols>
in einer Abhängigkeitseigenschaft verwendet.
public static readonly DependencyProperty ActualMessagesProperty =
DependencyProperty.Register("ActualMessages",
typeof(ObservableCollection<myControls>),
typeof(myPage),
new PropertyMetadata(new ObservableCollection<myControls>()));
und eine Eigenschaft gebunden in dem XAML-Code
public ObservableCollection<myControls> ActualMessages
{
get { return (ObservableCollection<myControls>)GetValue(myPage.ActualMessagesProperty); }
set
{
SetValue(myPage.ActualMessagesProperty, value);
this.OnPropertyChanged("ActualMessages");
}
}
private static object lockActualMessages = new object(); here
ich das mein Konstruktor hinzu:
BindingOperations.EnableCollectionSynchronization(ActualMessages, lockActualMessages);
Ich habe diese Methode, die aus einer statischen Klasse mit einem statischen genannt wird Eigenschaft geändert durch einen anderen Thread:
void Global_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "ActiveMessage":
lock (lockActualMessages){this.ActualMessages = Global.ActualMessages;}
break;
}
}
Die Global.ActualMessages
ist eine statische Eigenschaft, die von einer statischen Klasse stammt.
Dies ist meine statische Klasse:
internal class Global
{
private static ObservableCollection<myControls> actualMessages = new ObservableCollection<myControls>();
public static ObservableCollection<myControls> ActualMessages
{
get
{
return actualMessages;
}
set { actualMessages = value; OnPropertyChanged("ActualMessages"); }
}
}
Diese Klasse in einem anderen Thread verwendet wird, so dass, wenn er den Wert ändert und löst den PropertyChanged
Fall sollte die Abhängigkeitseigenschaft die ListView
in XAML aktualisieren. All dies funktioniert nicht und ich bekomme einen Zugriffsfehler zurück, der besagt, dass es nicht möglich ist, dies zu verwenden, da es von einem anderen Thread erstellt wurde.
Wie wird das Problem gelöst?
Haben Sie versucht, _Dispatcher.BeginInvoke() _ Methode zu verwenden? – Ron
Nur ein paar Anmerkungen. Zuerst sollten Sie 'this.OnPropertyChanged (" ActualMessages ")' nicht im Setter der 'ActualMessages' -Eigenschaft aufrufen. Dies ist weder notwendig (weil die Abhängigkeitseigenschaften integrierte Änderungsbenachrichtigungen enthalten), noch wird es zuverlässig aufgerufen, da WPF den Setter umgehen und 'SetValue (ActualMessagesProperty, ...) 'direkt aufrufen kann. Zweitens sollten Sie kein Auflistungsobjekt als Standardwert einer Abhängigkeitseigenschaft vom Auflistungstyp in PropertyMetadata zuweisen. Da es sich um Metadaten handelt, die statisch sind, wird das standardmäßige Auflistungsobjekt möglicherweise von mehreren Instanzen Ihrer myPage-Klasse verwendet. – Clemens