7

我目前正在升级我的前任的工具,但我遇到了一个TreeView问题。他的软件对数据进行了一次分析,并将结果显示在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); 
4

2 回答 2

5

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

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

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

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

你可以试试这样的 -

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

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

处理每个节点的展开和折叠事件(有子节点)

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

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

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 时,如果列表中存在标题(唯一 ID),请展开它 -

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

这需要对 groupItem 和 alarmItem 进行。

于 2012-07-18T12:54:16.130 回答
-1

比较TreeViewItem -

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]);
            }
        }
    }
}
于 2016-02-21T13:29:39.937 回答