In einer WPF-Anwendung, die ich mit dem MVVM-Muster schreibe, habe ich einen Hintergrundprozess, der das erledigt, aber Statusaktualisierungen abrufen muss auf die Benutzeroberfläche.Sicherstellen, dass OnPropertyChanged() für den UI-Thread in der MVVM WPF-App aufgerufen wird
Ich verwende das MVVM-Muster, daher kennt mein ViewModel praktisch nichts von der Ansicht (UI), die das Modell dem Benutzer präsentiert.
sagen, dass ich die folgende Methode in meinem Ansichtsmodell haben:
public void backgroundWorker_ReportProgress(object sender, ReportProgressArgs e)
{
this.Messages.Add(e.Message);
OnPropertyChanged("Messages");
}
Aus meiner Sicht habe ich eine List-Box müssen die Nachrichten Eigenschaft gebunden (a List<string>
) des Ansichtsmodell. OnPropertyChanged
erfüllt die Rolle der INotifyPropertyChanged
Schnittstelle durch Aufruf einer PropertyChangedEventHandler
.
Ich muss sicherstellen, dass OnPropertyChanged
auf dem UI-Thread aufgerufen wird - wie mache ich das? Ich habe folgendes versucht:
public Dispatcher Dispatcher { get; set; }
public MyViewModel()
{
this.Dispatcher = Dispatcher.CurrentDispatcher;
}
dann das folgende an die OnPropertyChanged
Methode:
if (this.Dispatcher != Dispatcher.CurrentDispatcher)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(delegate
{
OnPropertyChanged(propertyName);
}));
return;
}
aber das hat nicht funktioniert. Irgendwelche Ideen?
, sie hätte mit einer anderen geringfügigen Änderungen - ich meine Liste zu einem ObservableCollction geändert und es funktioniert wie ein Charme. Vielen Dank! –
Wenn "Nachrichten" beobachtbar ist, müssen Sie OnPropertyChanged() nicht aufrufen. – Doug