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>