Ich schreibe eine Anwendung in C#/WPF/Entity Framework DB zuerst kommuniziert mit einem proprietären Stück der industriellen Hardware, die Werte wie Durchfluss und Temperatur von einer Kühlmittelleitung misst. Diese Werte werden häufig in meiner SQL Server-Datenbank mit einem Thread aktualisiert, der im Hintergrund ausgeführt wird und dann in meiner Benutzeroberfläche angezeigt wird.So aktualisieren Sie WPF UI als Datenbankänderungen
Mein Anliegen ist derzeit, wie ich meine Benutzeroberfläche aktualisieren, um diese Änderungen widerzuspiegeln. Hier ist ein Beispiel dafür, wie ich einen Datagrid aktualisieren:
ich meine Datacontext zu meinem Viewmodel gesetzt und einen Thread instanziiert, dass jede Sekunde läuft:
_DataContext = new ViewModels.SummaryTable_ViewModel();
this.DataContext = _DataContext;
UIUpdateThread = new Thread(UIUpdaterThread);
UIUpdateThread.IsBackground = true;
UIUpdateThread.Start();
Das Modell meines Raster auf basiert ist ein IList <> das sieht wie folgt aus:
private IList<channel> _channel;
public IList<channel> Channels
{
get
{
return _channel;
}
set
{
_channel = value;
//NotifyPropertyChanged();
OnPropertyChanged("Channels");
}
}
dann jede Sekunde meine UIUpdateThread meine FillChannels nennt() -Methode, die sich wie folgt, dann werden die Gitter-Updates auf dem Property Benachrichtigung basiert:
using (var DTE = new myEntities())
{
if (DTE.channels.Any())
{
var q = (from a in DTE.channels
where a.setup.CurrentSetup == true
orderby a.ChannelNumber
select a).ToList();
this.Channels = q;
}
}
Also meine Frage ist das: gibt es eine bessere, elegantere Möglichkeit, dies zu tun? Das fühlt sich "falsch" an, weil es keinen besseren Begriff gibt. Und es hat schlechte Nebeneffekte, wie das Zurücksetzen der benutzerdefinierten Sortierung auf meinem Datagrid jedes Mal, wenn der Thread ausgeführt wird. Außerdem denke ich, dass es das MVVM-Muster bricht, obwohl ich nicht sicher bin. Ich denke zum Beispiel, was passiert, wenn der Thread, der mit meiner Hardware redet, jedes Mal ein gemeinsam genutztes Channel-Objekt aktualisiert, wenn er die Hardware nach Daten abfragt, und ich einfach meine UIs daran anbinde, würde ich das nicht tun müssen Führen Sie diesen Thread (oder die anderen Threads auf meinen anderen UIs, die dasselbe tun) nur auf Basis von PropertyChanged-Benachrichtigungen aus. Oder gibt es eine andere Methode, die mir völlig unbekannt ist? Bei der Suche nach einer Antwort habe ich erwähnt, dass das Muster der Arbeitseinheit, mit dem ich nicht vertraut bin, ein relevantes Konzept ist.
Wie Sie sehen können, bin ich mir nicht sicher, wohin ich von hier aus gehen könnte und könnte wirklich Hilfe gebrauchen. Entschuldigung für die Textwand, ich wollte nur so gründlich wie möglich sein. Jede Hilfe würde sehr geschätzt werden. Vielen Dank.
Ich würde 'Channels' eine' ObservableCollection' machen, um damit zu beginnen. Wenn Elemente hinzugefügt oder entfernt werden, würde ich sie hinzufügen/entfernen, anstatt die Sammlung neu zu erstellen. Im Allgemeinen ist Ihr vorletzter Absatz auf dem Geld: Ändern Sie vorhandene Dinge, die entsprechende Änderungsbenachrichtigungen auslösen. Wird relativ verwirrt, wenn man den gesamten neuen aktuellen Zustand plumpst, aber wenn Sie das tun müssen, müssen Sie das tun. P.S .: Was Rory.ap gesagt hat. –
Danke für die Hilfe @EdPlunkett – user3900520