创建,刷新WPF TreeView并记住没有XAML的扩展节点

Lar*_*mow 7 .net c# wpf treeview xaml

我目前正在升级我的前任的工具,我陷入了一个TreeView问题.他的软件分析了一次数据并将结果显示在a TreeView.我更改了工具来分析实时数据,因此用户可以获得实时结果.现在,我希望树形视图节点在用户扩展时保持扩展,即使在更新之后也是如此.我知道这个话题已经讨论了几次,我花了几个小时阅读答案,但我从未找到解决问题的方法.

基本问题是:不再有稳定的树,目前每次只重新创建树.到目前为止,我还不知道数据绑定或XAML,也没有时间在XAML中学习编程.您可以在下面看到我的前任创建的代码.到目前为止我没有改变任何东西,我只是每2-5秒回忆一下这个方法.

是否有(简单?)方式将扩展节点的信息存储在任何地方(全局?)并在刷新后重新扩展它或者我是否真的需要首先更深入地了解WPF?

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); 
Run Code Online (Sandbox Code Playgroud)

akj*_*shi 5

我真的需要先更深入地了解 WPF 吗?

我会说是的,特别是如果您计划在更长的时间内工作/支持此应用程序;如果您将来想在 WPF 中工作,那么最好先了解 XAML 和 WPF 概念。

就我个人而言,我永远不会以这种方式实现这个工具,相反,我会按照以下文章中的描述使用 MVVM 方法,并使其干净、可维护和高效 -使用 ViewModel 模式简化 WPF TreeView

有没有一种(简单的?)方法可以在任何地方(全局?)存储有关扩展节点的信息并在刷新后重新扩展它

你可以试试这样的——

创建一个列表来存储扩展节点的标头(或任何唯一的属性/id)

private List<string> expandedNodes = new List<string>();
Run Code Online (Sandbox Code Playgroud)

处理每个节点(有子节点)的 Expanded 和 Collapsed 事件

TreeViewItem alarmItem = new TreeViewItem();
alarmItem.Expanded += OnAlarmItemExpanded;
Run Code Online (Sandbox Code Playgroud)

每当节点展开/折叠时更新列表 -

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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

下次创建 TreeViewItem 时,如果列表中存在它的 header(Uniques Id),请展开它 -

if (expandedNodes.Contains(header))
{
    alarmItem.IsExpanded = true;
}
Run Code Online (Sandbox Code Playgroud)

这需要为 groupItem 和 alarmItem 完成。