代码之家  ›  专栏  ›  技术社区  ›  deadlyvices

对象层次结构中的层次结构更改通知

  •  1
  • deadlyvices  · 技术社区  · 6 年前

    , 坚果 . 可以包含其他 ,或 坚果 . 显然不能包含任何内容。

    盒子 可观测集合 属于 盒子 , 螺帽 螺栓 . 每个 螺栓 更改了InotifyProperty .

    是否有一个公认的最佳实践来将更改通知传播到可观察集合,或在任何 螺栓 指向一个对象,该对象包含对最顶端的引用 ? 或者你会推荐什么特别的设计模式?

    编辑 :为了给这个问题提供一些背景知识,我领导 Chemistry for Word Chem4Word Navigator 不管你信不信,现在 一切 使用WPF和MVVM!)这已经证明有太多的开销和缺乏灵活性的长期解决方案。所以我又回到了 直接的。这种方法允许更精细的控制。 这个 , 坚果 在我最初的例子中是 分子 , 债券

    3 回复  |  直到 6 年前
        1
  •  2
  •   Clay    6 年前

    我有一个类似的模型,可以快速到达上游 Node 有向无环图中的实例。一个 对其直系父项的引用较弱。 节点 有一个属性来获取根…该属性试图返回其父级的根。如果没有父节点,则该节点是根节点。根性完全基于包容。注意父节点不是集合…因为有时子节点甚至不在集合中。或多或少像。。。

    public abstract class Node
    {
      WeakReference<Node> parent;
    
      public Node Root
      {
        get { return Parent?.Root ?? this; }
      }
    
      public Node Parent
      {
        get
        {
          if ( parent != null )
          {
            if ( parent.TryGetTarget( out Node parentNode ) )
            {
              return parentNode;
            }
          }
          return this;
        }
        internal set { /*...*/ } //--> if you're brave...
      }
    }
    

    编辑

    关于WeakReferences…我们的图可以有的一个功能是引用其他图中的节点。我们有一个节点解析服务来获取其他节点。这些向外看的引用由标识值(a)表示 GUID 或者 Long )以及相关的弱引用。这样,我们可以根据需要加载指定的节点,但不能将其保留超过需要的时间。解析器维护这样解析的节点的LRU缓存。

    所以,弱引用有助于解决所有这些偶然解决的场景。呃…更准确地说,它们帮助我们在这种情况下不搞砸垃圾收集。

    在一些分析场景中,我们将有数十万个节点进出。我可以想象化学建模中的类似动力学。

        2
  •  1
  •   Murray Foxcroft    6 年前

    为什么不在更改通知中调用父级。类似于以下伪代码:

    Bolt()
    {
        NotifyPropertyChanged(property)
        {
             PropertyChanged(this, property);
        }
    
        ChildNutPropertyChanged(Nut child, property)
        {
             PropertyChanged(this, child + property);
        }
    }
    
    
    Nut(Bolt parentBolt)
    { 
        parent = parentBolt;
    
        NotifyPropertyChanged(property)
        {
             PropertyChanged(this, property);
             parent.NotifyPropertyChanged(this, property);
        }
    }
    
        3
  •  1
  •   Gimly    6 年前

    ObservableCollection 只做一个 ReadOnlyObservableCollection 公开,你可以 Add(Nut nut) 方法(以及螺栓的另一个方法)注册到添加的螺母的 NotifyPropertyChanged

    这样,你就会知道 Box 当一个孩子的属性改变并采取行动时。