/// <summary>
        /// Appends the marble.
        /// </summary>
        /// <param name="itemWrapper">The item wrapper.</param>
        public void AppendMarble(MarbleItemViewModel itemWrapper)
        {
            #region Validation

            if (itemWrapper == null)
            {
                throw new NullReferenceException("itemWrapper");
            }

            #endregion Validation

            MarbleBase item = itemWrapper.Item;

            if (TabKind == TabKind.Flat)
            {
                FlatItems.AddAsync(item);
                return;
            }

            itemWrapper.MainContext = this;

            #region Diagrams.AddAsync(diagram)

            MarbleDiagramModel diagram;
            if (!_marbleDiagrams.TryGetValue(item.Name, out diagram))
            {
                diagram = new MarbleDiagramModel(item.Name, item.IndexOrder, this);
                if (_marbleDiagrams.TryAdd(item.Name, diagram))
                {
                    Diagrams.AddAsync(diagram);
                }
                else
                {
                    diagram.Dispose();
                    diagram = _marbleDiagrams[item.Name];
                }
            }

            #endregion // Diagrams.AddAsync(diagram)

            itemWrapper = itemWrapper.Clone(diagram);
            diagram.AppendMarble(itemWrapper);
        }