I have the following Button:
<Button Grid.Row="0" Grid.Column="0" Command="{Binding DrawXO}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource BoardIndexConverter}">
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}" Path="(Grid.Row)"></Binding>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}" Path="(Grid.Column)" ></Binding>
</MultiBinding>
</Button.CommandParameter>
</Button>
and the following MultiValueConverter:
class BoardIndexConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Clone();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
How do I get the actual value of the Grid.Row\Column from a DependencyProperty in my command?:
class DrawXOCommand : ICommand
{
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
var values = (object[])parameter;
var row = (int)(values[0]);
var column = (int)values[1];
}
public event EventHandler CanExecuteChanged;
You should have seen Binding error messages in the Output Window in Visual Studio, because the Button is not an ancestor element here.
Instead of FindAncestor
you should use Self
to use the Button as source object:
<MultiBinding Converter="{StaticResource BoardIndexConverter}">
<Binding RelativeSource="{RelativeSource Self}" Path="(Grid.Row)"/>
<Binding RelativeSource="{RelativeSource Self}" Path="(Grid.Column)"/>
</MultiBinding>
Your converter may also be implemented a little safer:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length == 2 && values[0] is int && values[1] is int)
{
return new Tuple<int, int>((int)values[0], (int)values[1]);
}
return null;
}
Then check the command parameter like this:
public void Execute(object parameter)
{
var cell = parameter as Tuple<int, int>;
if (cell != null)
{
var row = cell.Item1;
var column = cell.Item2;
...
}
}