public override void Execute()
        {
            // Verify all [Required] and [Import]ed properties have valid values.
            this.ValidateObject();

            var application = CurrentElement.Root.As <IApplication>();
            var command     = CurrentElement.As <ICommand>();

            var handlerLinks =
                application.Design.Services.Service
                .SelectMany(s =>
                            s.Components.Component.SelectMany(c => c.Subscribes.ProcessedCommandLinks.Where(l => l.CommandReference.Value == command)))
                .ToList();
            var senderLinks =
                application.Design.Services.Service
                .SelectMany(s =>
                            s.Components.Component.SelectMany(c => c.Publishes.CommandLinks.Where(l => l.CommandReference.Value == command)))
                .ToList();

            var relatedComponents =
                handlerLinks.Select(l => l.Parent.Parent)
                .Concat(senderLinks.Select(l => l.Parent.Parent))
                .Distinct()
                .ToList();

            if (relatedComponents.Count == 0)
            {
                return;
            }

            var viewModel =
                new RelatedComponentsPickerViewModel(relatedComponents, command)
            {
                Title = "Related Components"
            };

            var picker = WindowFactory.CreateDialog <RelatedComponentsPicker>(viewModel);

            using (new MouseCursor(Cursors.Arrow))
            {
                if (picker.ShowDialog().GetValueOrDefault())
                {
                    foreach (var component in viewModel.SelectedComponents)
                    {
                        component.Delete();
                    }
                }

                foreach (var link in handlerLinks)
                {
                    link.Delete();
                }

                foreach (var link in senderLinks)
                {
                    link.Delete();
                }
            }
        }
        public override void Execute()
        {
            // Verify all [Required] and [Import]ed properties have valid values.
            this.ValidateObject();

            var application = CurrentElement.Root.As <IApplication>();
            var command     = CurrentElement.As <ICommand>();

            var handlerLinks =
                application.Design.Services.Service
                .SelectMany(s =>
                            s.Components.Component.SelectMany(c => c.Subscribes.ProcessedCommandLinks.Where(l => l.CommandReference.Value == command)))
                .ToList();
            var senderLinks =
                application.Design.Services.Service
                .SelectMany(s =>
                            s.Components.Component.SelectMany(c => c.Publishes.CommandLinks.Where(l => l.CommandReference.Value == command)))
                .ToList();

            var relatedComponents =
                handlerLinks.Select(l => l.Parent.Parent)
                .Concat(senderLinks.Select(l => l.Parent.Parent))
                .Where(c => c != null)
                .Distinct()
                .ToList();

            tracer.Verbose(
                "Prompting for confirmation of deletion for command '{0}' with related components {1}",
                command.InstanceName,
                string.Join(", ", relatedComponents.Select(c => "'" + c.InstanceName + "'")));

            var viewModel =
                new RelatedComponentsPickerViewModel(relatedComponents, command)
            {
                Title = "Delete the component?"
            };

            var picker = WindowFactory.CreateDialog <RelatedComponentsPicker>(viewModel);

            using (new MouseCursor(Cursors.Arrow))
            {
                if (picker.ShowDialog().GetValueOrDefault())
                {
                    var selectedComponents = viewModel.SelectedComponents.ToList();

                    tracer.Info(
                        "Deleting command '{0}' and related components {1}",
                        command.InstanceName,
                        string.Join(", ", selectedComponents.Select(c => "'" + c.InstanceName + "'")));

                    foreach (var component in selectedComponents)
                    {
                        component.Delete();
                    }

                    foreach (var link in handlerLinks)
                    {
                        link.Delete();
                    }

                    foreach (var link in senderLinks)
                    {
                        link.Delete();
                    }

                    command.Delete();
                }
                else
                {
                    tracer.Verbose("Deletion for command '{0}' cancelled", command.InstanceName);
                }
            }
        }