public CanvasContent Deserialize()
        {
            var root = XElement.Load( myReader );

            double offsetX = Double.Parse( root.Attribute( "OffsetX" ).Value, CultureInfo.InvariantCulture );
            double offsetY = Double.Parse( root.Attribute( "OffsetY" ).Value, CultureInfo.InvariantCulture );

            var items = new List<DesignerItem>();

            var itemsXML = root.Elements( "DesignerItems" ).Elements( "DesignerItem" );
            foreach( var itemXML in itemsXML )
            {
                var id = new Guid( itemXML.Element( "ID" ).Value );
                var item = DeserializeDesignerItem( itemXML, id );

                item.SetConnectorDecoratorTemplate();

                items.Add( item );
            }

            var connections = new List<Connection>();

            var connectionsXML = root.Elements( "Connections" ).Elements( "Connection" );
            foreach( var connectionXML in connectionsXML )
            {
                var sourceID = new Guid( connectionXML.Element( "SourceID" ).Value );
                var sinkID = new Guid( connectionXML.Element( "SinkID" ).Value );

                var sourceConnectorName = connectionXML.Element( "SourceConnectorName" ).Value;
                var sinkConnectorName = connectionXML.Element( "SinkConnectorName" ).Value;

                var sourceConnector = GetConnector( items, sourceID, sourceConnectorName );
                var sinkConnector = GetConnector( items, sinkID, sinkConnectorName );

                var connection = new Connection( sourceConnector, sinkConnector );

                connection.SourceArrowSymbol = ( ArrowSymbol )Enum.Parse( typeof( ArrowSymbol ), connectionXML.Element( "SourceArrowSymbol" ).Value );
                connection.SinkArrowSymbol = ( ArrowSymbol )Enum.Parse( typeof( ArrowSymbol ), connectionXML.Element( "SinkArrowSymbol" ).Value );
                connection.IsDotted = connectionXML.Element( "IsDotted" ) != null ? bool.Parse( connectionXML.Element( "IsDotted" ).Value ) : false;

                Canvas.SetZIndex( connection, Int32.Parse( connectionXML.Element( "zIndex" ).Value ) );

                var propertiesContent = ConvertBladeNamespaces(connectionXML.Element("Properties").Value);

                using (var reader = XmlReader.Create(new StringReader(propertiesContent)))
                {
                    var properties = (ItemPropertyCollection)XamlReader.Load(reader);
                    connection.Properties = properties;
                }

                connection.Caption = connectionXML.Element( "Caption" ).Value;

                connections.Add( connection );
            }

            var canvas = new CanvasContent( items, connections );
            canvas.AddOffset( offsetX, offsetY );

            return canvas;
        }
        private void CopyCurrentSelection()
        {
            var selectedDesignerItems = SelectionService.CurrentSelection.OfType<DesignerItem>();
            var selectedConnections = SelectionService.CurrentSelection.OfType<Connection>().ToList();

            foreach( Connection connection in this.Children.OfType<Connection>() )
            {
                if( !selectedConnections.Contains( connection ) )
                {
                    DesignerItem sourceItem = ( from item in selectedDesignerItems
                                                where item.ID == connection.Source.ParentDesignerItem.ID
                                                select item ).FirstOrDefault();

                    DesignerItem sinkItem = ( from item in selectedDesignerItems
                                              where item.ID == connection.Sink.ParentDesignerItem.ID
                                              select item ).FirstOrDefault();

                    if( sourceItem != null &&
                        sinkItem != null &&
                        BelongToSameGroup( sourceItem, sinkItem ) )
                    {
                        selectedConnections.Add( connection );
                    }
                }
            }

            var content = new CanvasContent( selectedDesignerItems, selectedConnections );
            content.AddOffset( 10, 10 );

            PersistenceService.CopyToClipboard( content );
        }