11.25.2009

Named Command Decorator

Here is the problem, we have a list of ‘commands’ we wish to show depending on what view model / entity is active. If we just had a collection of ICommands, we could show buttons but what would their content be?

My solution is to use the decorator pattern to decorate commands with a Name that can be used as the content for the buttons.

My decorator looks like :

    public class NamedCommand : ICommand

    {

        public NamedCommand(ICommand decoratedCommand, string name)

        {

            _DecoratedCommand = decoratedCommand;

            Name = name;

        }

 

        readonly ICommand _DecoratedCommand;

        public string Name { get; set; }

 

        public void Execute(object parameter)

        {

            _DecoratedCommand.Execute(parameter);

        }

 

        public bool CanExecute(object parameter)

        {

            return _DecoratedCommand.CanExecute(parameter);

        }

 

        public event EventHandler CanExecuteChanged;

    }

I then created an extension method on ICommand :

        public static ICommand Name(this ICommand command, string name)

        {

            return new NamedCommand(command, name);

        }

So in the code I can now do:

            Commands.Add(new ActionCommand(OnOpen).Name("Open"));

For my WPF visual, I have a DataTemplate :

    <DataTemplate DataType="{x:Type Commands:NamedCommand}" >

        <Button Content="{Binding Name}"

               Command="{Binding }" />

    </DataTemplate>