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);
                }
            }
        }