wpf Use IMultiValueConverter to pass multiple parameters to a Command


It is possible to pass multiple bound values as a CommandParameter using MultiBinding with a very simple IMultiValueConverter:

namespace MyProject.Converters
    public class Converter_MultipleCommandParameters : MarkupExtension, IMultiValueConverter
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            return values.ToArray();
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            throw new NotSupportedException();

        private static Converter_MultipleCommandParameters _converter = null;

        public override object ProvideValue(IServiceProvider serviceProvider)
            if (_converter == null) _converter = new Converter_MultipleCommandParameters();
            return _converter;

        public Converter_MultipleCommandParameters()
            : base()

Using the converter:

  1. Example implementation - method called when SomeCommand is executed (note: DelegateCommand is an implementation of ICommand that is not provided in this example):

     private ICommand _SomeCommand;
     public ICommand SomeCommand
         get { return _SomeCommand ?? (_SomeCommand = new DelegateCommand(a => OnSomeCommand(a))); }
     private void OnSomeCommand(object item)
         object[] parameters = item as object[];
             string.Format("Execute command: {0}\nParameter 1: {1}\nParamter 2: {2}\nParamter 3: {3}",
             "SomeCommand", parameters[0], parameters[1], parameters[2]));
  2. Define namespace


  1. Example use of this converter in binding

    <Button Width="150" Height="23" Content="Execute some command" Name="btnTestSomeCommand"
         Command="{Binding Path=SomeCommand}" >
             <MultiBinding Converter="{converters:Converter_MultipleCommandParameters}">
                 <Binding RelativeSource="{RelativeSource Self}" Path="IsFocused"/>
                 <Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
                 <Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/>