Search code examples
c#wpflistview

WPF How to bind to ICommand in the ViewModel from inside a ListView GridView?


I have a WPF application using MVVM. I have a view with a View Model as its DataContext. Inside the View, I have a ListView binding to an observable collection. On each row of the ListView, I have a button that I want to bind to an ICommand in the DataContext. How do I set the RelativeSource to get to the DataContext ICommand?

xaml

<ListView ItemsSource="{Binding Services}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Frequency" DisplayMemberBinding="{Binding Frequency}" />
            <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Type}" />
            <GridViewColumn Header="Enable State" DisplayMemberBinding="{Binding EnableState}" />
            <GridViewColumn Header="" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button Background="Transparent" BorderThickness="0" Command="{Binding RemoveTimerClick}" CommandParameter="{Binding}">
                           <Image Source="pack://application:,,,/Resources/Images/Delete.png" Width="20"/>
                       </Button>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

This Command binding is looking for a the ICommand in the Services. I tried

Command="{Binding RemoveTimerClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"

But this didn't work because it is binding to the UserControl (which is the View), not the DataContext (which is the View model). How do I bind to the DataContext that also contains the Services collection?


Solution

  • Found the answer here. You have to add DataContext to the bound command:

    Command="{Binding Path=DataContext.RemoveTimerClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" CommandParameter="{Binding}"