2017-02-10 3 views
0

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?

+0

Haben Sie versucht, _Dispatcher.BeginInvoke() _ Methode zu verwenden? – Ron

+0

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

Antwort

0

Nur weil auf die Quellensammlung ObservableCollection<T> von einem anderen Thread zugegriffen werden kann, heißt das nicht, dass Sie die Abhängigkeitseigenschaft des Steuerelements von einem anderen Thread festlegen können.

Auf ein Steuerelement kann nur von dem Thread zugegriffen werden, auf dem es ursprünglich erstellt wurde - das ist der UI-Thread.

Statt die Abhängigkeitseigenschaft der Kontrolle der Einstellung könnten Sie versuchen, die Quellensammlung zu löschen und neu zu füllen, zum Beispiel:

void Global_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    switch (e.PropertyName) 
    { 
     case "ActiveMessage": 
      lock (lockActualMessages) 
      { 
       this.ActualMessages.Clear(); 
       if (Global.ActualMessages != null) 
       { 
        foreach (var message in Global.ActualMessages) 
         this.ActualMessages.Add(message); 
       } 
      } 

      break; 
    } 
} 

Offensichtlich benötigen Sie einen Minimal, Complete, and Verifiable example Ihrer Ausgabe zu liefern, wenn Sie weitere benötigen Hilfe.

Verwandte Themen