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:
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[];
MessageBox.Show(
string.Format("Execute command: {0}\nParameter 1: {1}\nParamter 2: {2}\nParamter 3: {3}",
"SomeCommand", parameters[0], parameters[1], parameters[2]));
}
Define namespace
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
Example use of this converter in binding
<Button Width="150" Height="23" Content="Execute some command" Name="btnTestSomeCommand"
Command="{Binding Path=SomeCommand}" >
<Button.CommandParameter>
<MultiBinding Converter="{converters:Converter_MultipleCommandParameters}">
<Binding RelativeSource="{RelativeSource Self}" Path="IsFocused"/>
<Binding RelativeSource="{RelativeSource Self}" Path="Name"/>
<Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/>
</MultiBinding>
</Button.CommandParameter>
</Button>