Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当分支上的任何元素发生更改时,如何标记树结构的整个分支?_Java_C#_Wpf_Javafx - Fatal编程技术网

Java 当分支上的任何元素发生更改时,如何标记树结构的整个分支?

Java 当分支上的任何元素发生更改时,如何标记树结构的整个分支?,java,c#,wpf,javafx,Java,C#,Wpf,Javafx,我有一个树结构,希望能够标记(例如颜色)从修改节点到根节点的节点。如果任何子节点标记为“已修改”,则应将父节点标记为“已修改”。当子节点返回到未修改的状态时,应根据该节点的状态和其他子节点的状态更新父节点 我试过: 当单个子项的状态更改时检查所有子项的状态并通知父项。这是低效的,但不占用内存 在“parents”中保留已修改的子项的计数并保持更新,这允许我避免检查单个子项状态更改时的所有子项。这适用于1级以下 这个问题还有其他解决方案吗?你可以打电话给所有孩子,检查他们是否被修改过。然后他们

我有一个树结构,希望能够标记(例如颜色)从修改节点到根节点的节点。如果任何子节点标记为“已修改”,则应将父节点标记为“已修改”。当子节点返回到未修改的状态时,应根据该节点的状态和其他子节点的状态更新父节点

我试过:

  • 当单个子项的状态更改时检查所有子项的状态并通知父项。这是低效的,但不占用内存
  • 在“parents”中保留已修改的子项的计数并保持更新,这允许我避免检查单个子项状态更改时的所有子项。这适用于1级以下

这个问题还有其他解决方案吗?

你可以打电话给所有孩子,检查他们是否被修改过。然后他们依次给孩子打电话,例如

public class Node
    {
        public List<Node> Children { get; set; } = new List<Node>();

        private bool _modified = false;

        public bool HasBeenModified
        {
            get => _modified || Children.Any(c => c.HasBeenModified);
            set => _modified = value;
        }
    }

为什么这个问题被标记为/和/?我需要这些技术中的任何一种解决方案。即使是一般的想法也很好。第二种方法有什么问题?当一个子节点被修改时,它会通知它的父节点,父节点会通知它的父节点,依此类推,直到到达根节点为止。当一个子项“未修改”时,同样的通知过程再次发生。而父母只需记下修改过的孩子的数量;如果
count>0
,则它已修改子项。Wpf已路由事件,这些事件会在控件树上冒泡。如果此树结构是wpf树视图,则可以使用属性更改通知。或您可以将父节点的引用传递到子节点,子节点会在修改时通知父节点。一个方法使用它来设置整个集合状态和父状态。@Slaw,你说得对。我最终使用了这种方法。是的,这是一种“暴力”解决方案:)
public static void Main(string[] args)
    {
        var parentNode = new Node();
        var childNodeOne = new Node();
        var childNodeTwo = new Node();
        var childNodeOneOne = new Node();

        childNodeOne.Children.Add(childNodeOneOne);
        parentNode.Children.Add(childNodeOne);
        parentNode.Children.Add(childNodeTwo);

        // Check is currently not modified
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        // Mark node 2 has modified and check again
        childNodeTwo.HasBeenModified = true;
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        // Unmark node 2 and make sure it's no longer modified
        childNodeTwo.HasBeenModified = false;
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        // Mark the second level child node as modified and check parent is also showing as modified
        childNodeOneOne.HasBeenModified = true;
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        Console.ReadKey();
    }