Álvaro García
Álvaro García

Reputation: 19356

Why is the click event of a button inside a DataGrid is not fired?

I am using MVVM pattern and MVVM Light to convert an event into a command, in my XAML I have this code:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Content="+" Padding="0,0,0,0" Height="Auto">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <i:InvokeCommandAction Command="{Binding MyCommand}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

In my view model I have this code:

private RelayCommand<SelectionChangedEventArgs> _myCommand;
public RelayCommand<SelectionChangedEventArgs> MyCommandCommand
{
    get { return _myCommand ?? (_myCommand = new RelayCommand<SelectionChangedEventArgs>(myCommandCommand)); }
}

private void myCommand(SelectionChangedEventArgs e)
{
    // code
}

But the click event is not fired. However, I am using this way for every button in my application and when the button is into a user control or window, the event is fired.

Thanks.

Upvotes: 2

Views: 2060

Answers (2)

Paul Schroeder
Paul Schroeder

Reputation: 1601

Besides the above answer, I found that it was also necessary to specify ClickMode="Press" in Xaml.

<Button Content="&#xE16F;" Focusable="True" FontFamily="Segoe UI Symbol" FontSize="16" Background="{StaticResource HeroLightGray}" Foreground="Black" HorizontalAlignment="Center" VerticalAlignment="Center" 
ClickMode="Press" 
Command="{Binding DataContext.CopyMetadataSourceAsync, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" CommandParameter="{Binding .}" />

I do not recall having to do this in the past, but after spending hours troubleshooting, converting RelayCommand to IAsyncCommand, etc. this is the only thing that worked. In fact, I couldn't even get a regular code-behind "Click event" method to fire unless I included that ClickMode="Press"!

Upvotes: 0

123 456 789 0
123 456 789 0

Reputation: 10865

Change your binding, the DataContext that it's trying to look for is the DataContext for the Template which might be different depending on your structure.

Change it to this

<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.MyCommand}" /

Upvotes: 6

Related Questions