Erstellen, aktualisieren einer WPF-TreeView und denken Sie daran expandierten Knoten ohne XAML
Ich bin derzeit auf der Upgrade-tool von meinem Vorgänger und ich bin stecken geblieben auf einem TreeView
Problem. Seine software analysiert Daten ein mal und zeigte die Ergebnisse in einer TreeView
. Ich wechselte das Werkzeug zum analysieren von Daten in Echtzeit und damit erhält der Benutzer Echtzeit-Ergebnisse. Nun, ich würde gerne in der Strukturansicht den Knoten zu halten, erweitert, wenn der Benutzer erweitert es auch nach dem update. Ich weiß, das Thema wurde mehrmals diskutiert und ich verbrachte Stunden Lesen die Antworten, aber ich fand nie eine Lösung für mein problem.
Das grundlegende problem ist: es gibt keine stable-tree nicht mehr und derzeit der Baum ist gerade neu erstellt jedes mal. Ich habe keine Ahnung über Datenbindung oder XAML-bis jetzt und einige Zeit lernen Sie die Programmierung im XAML-Code. Unten sehen Sie den code, wie es wurde von meinem Vorgänger. Ich habe nichts ändern, bis jetzt habe ich nur erinnern, diese Methode alle 2-5 Sekunden.
Gibt es eine (einfache?) Möglichkeit zum speichern der Informationen über expandierten Knoten irgendwo (global?) und re-erweitern Sie es nach dem aktualisieren, oder muss ich wirklich brauchen, um ein tieferes Verständnis von WPF erste?
foreach (Analyzer.ALARM_GROUP alarmGroup in alarmGroupList)
{
//Display Problem Group
TreeViewItem groupItem = new TreeViewItem();
List<String> ListAreas = new List<string>();
string areas = "";
//GROUP HEADER
//display alarm group which contains more than one alarm
if (alarmGroup.AlarmList.Count > 1)
{
groupItem.Header = Convert.ToString(alarmGroup.AlarmList.Count) + " --- " + alarmGroup.AlarmList[0].EventTime + " " + alarmGroup.AlarmList[0].AlarmText + "\n "
+ alarmGroup.AlarmList[alarmGroup.AlarmList.Count - 1].EventTime + " " + alarmGroup.AlarmList[alarmGroup.AlarmList.Count - 1].AlarmText
+ " --- " + " AREAS: " + areas;
}
else //display alarm group with only one alarm message
{
groupItem.Header = Convert.ToString(alarmGroup.AlarmList.Count) + " --- " + alarmGroup.AlarmList[0].EventTime + " " + alarmGroup.AlarmList[0].AlarmText + " --- " + " AREA: " + areas;
}
//HEADLINE of single Alarm Item
TreeViewItem alarmItem = new TreeViewItem();
alarmItem.Header = "[EVENTTIME] [ALARMTAG] --- [OPCCONDITION] --- [SEVERITY] --- [AREA] --- [ALARMTEXT]";
alarmItem.FontWeight = FontWeights.SemiBold;
groupItem.Items.Add(alarmItem);
//Display single alarm messages
foreach (var alarm in alarmGroup.AlarmList)
{
alarmItem = new TreeViewItem();
alarmItem.Header = alarm.EventTime + " --- " + alarm.AlarmTag + " --- " + alarm.Condition + " --- " + alarm.Severity + " --- " + alarm.Area + " --- " + alarm.AlarmText;
alarmItem.FontWeight = FontWeights.Normal;
groupItem.Items.Add(alarmItem);
}
AlarmPresentationBox.Items.Add(groupItem);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde sagen ja, vor allem, wenn Sie planen, um die Arbeit/Unterstützung dieser Anwendung für längere Zeit; und wenn Sie möchte in WPF in Zukunft, dann ist es besser, Ihre Hände schmutzig mit XAML und WPF-Konzepte.
Ich persönlich würde nie implementieren Sie dieses tool auf diese Weise, stattdessen würde ich gehen für MVVM-Ansatz weiter, wie beschrieben im folgenden Artikel und machen Sie es sauber, wartbar und effizient - Vereinfachung der WPF-TreeView Mithilfe der ViewModel-Muster
Können Sie versuchen, so etwas wie dieses -
Erstellen einer Liste zum speichern der header(oder eine eindeutige Eigenschaft/id) von expandierten Knoten
Behandeln den auf-und Zugeklappt Fall von jedem Knoten(mit untergeordneten Knoten)
Update der Liste mit jedem Knoten wird erweitert/reduziert -
Nächste mal, wenn Sie erstellen ein TreeViewItem, erweitern Sie es, wenn es header(Eindeutige Id) vorhanden ist in der Liste -
Dies getan werden muss, um für beide groupItem und alarmItem.
CompareTreeViewItem -