Create, update WPF TreeView and remember extended nodes without XAML

I am currently updating my predecessor tool and I am stuck in a problem TreeView. His software analyzed the data once and displayed the results in TreeView. I changed the tool for real-time data analysis, and therefore, the user gets real-time results. Now I would like the nodes of the view tree to expand when the user expands it, even after updating. I know that this topic was discussed several times, and I read the answers for hours, but I never found a solution to my problem.

The main problem: there is no longer a stable tree, and currently the tree is just being recreated. I have no idea about data binding or XAML so far and have little time to learn programming in XAML. Below you can see the code that was created by my predecessor. I have not changed anything so far, I just remember this method every 2-5 seconds.

Is there a way (simple?) To store information about extended nodes anywhere (globally?) And re-extend it after the upgrade, or do I really need to get a deeper understanding of WPF first?

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); 
+5
source share
2 answers

Do I really need to get a deeper understanding of WPF first?

"", / ; WPF , XAML WPF.

, MVVM-, , , - WPF TreeView ViewModel

(?) (?)

- -

( /id )

private List<string> expandedNodes = new List<string>();

Expanded and Collapsed node ( )

TreeViewItem alarmItem = new TreeViewItem();
alarmItem.Expanded += OnAlarmItemExpanded;

, node / -

private void OnAlarmItemExpanded(object sender, RoutedEventArgs e)
{
    TreeViewItem treeNode = sender as TreeViewItem;
    string header = treeNode.Header.ToString();
    if (expandedNodes.Contains(header) == false)
    {
        expandedNodes.Add(header);
    }
}

private void OnAlarmItemCollapsed(object sender, RoutedEventArgs e)
{
    TreeViewItem treeNode = sender as TreeViewItem;
    string header = treeNode.Header.ToString();
    if (expandedNodes.Contains(header))
    {
        expandedNodes.Remove(header);
    }
} 

, TreeViewItem, , (Uniques Id) -

if (expandedNodes.Contains(header))
{
    alarmItem.IsExpanded = true;
}

groupItem, alarmItem.

+3

CompareTreeViewItem -

private void CompareTreeViewItem(TreeViewItem TViewItem1,TreeViewItemTViewItem2)
{
    if ((string)TViewItem1.Header == (string)TViewItem2.Header)
    {
        TViewItem2.IsExpanded = TViewItem1.IsExpanded;

        if (TViewItem1.Items.Count > 0)
        {
            for (int i = 0; i < TViewItem1.Items.Count && i < TViewItem2.Items.Count; i++)
            {
                CompareTreeViewItem((TreeViewItem)TViewItem1.Items[i],
                                    (TreeViewItem)TViewItem2.Items[i]);
            }
        }
    }
}
-1

All Articles