Exemplo n.º 1
0
        public override void ChangeEdge(TEdge sinkEdge, TItem newItem, bool changeRoot)
        {
            Func <TItem>   getItem = () => changeRoot ? sinkEdge.Root : sinkEdge.Leaf;
            Action <TItem> setItem = item => { if (changeRoot)
                                               {
                                                   sinkEdge.Root = item;
                                               }
                                               else
                                               {
                                                   sinkEdge.Leaf = item;
                                               } };

            var itemBefore = getItem();

            Source.ChangeEdge(sinkEdge, newItem, changeRoot);
            var lockObj = (object)sinkEdge;

            lock (lockObj) {
                // revert the changes, otherwise edge is not removed from Sink.Edges(itemBefore)
                setItem(itemBefore);

                Sink.ChangeEdge(sinkEdge, newItem, changeRoot);

                // ensure the changes are done
                if (!object.Equals(getItem(), newItem))
                {
                    setItem(newItem);
                }
            }
        }
Exemplo n.º 2
0
        public override void ChangeEdge(TSinkEdge sinkEdge, TSinkItem newItem, bool changeRoot)
        {
            var source = Get(sinkEdge);

            Sink.ChangeEdge(sinkEdge, newItem, changeRoot);
            if (source != null)
            {
                var sourceEdge    = (TSourceEdge)source;
                var newSourceEdge = Mapper.TryGetCreate(newItem);
                Source.ChangeEdge(sourceEdge, newSourceEdge, changeRoot);
            }
        }