Bind event to ViewModel

13,864

InvokeCommandAction requires the ICommand to be bound not an event handler as you've bound (EmployeeGrid_MouseLeftButtonUp).

So you can introduce a command in ViewModel and bind to it:

View Model:

public ICommand SomeActionCommand { get; set; }

XAML:

<i:InvokeCommandAction Command="{Binding SomeActionCommand}" />
Share:
13,864
Jelle Capenberghs
Author by

Jelle Capenberghs

Graduated in June 2011 as Bachelor in Applied Computer Sciences. Now a junior .Net developer

Updated on June 04, 2022

Comments

  • Jelle Capenberghs
    Jelle Capenberghs about 1 year

    I am using WPF and PRISM framework for my application. The pattern I am using is MVVM (Model - View - ViewModel) and I am trying to bring the MouseLeftButtonUp event from the code-behind in the View to the ViewModel (so the event will be according the MVVM rules). For now I have this:

    View.xaml:

    <DataGrid x:Name="employeeGrid" Height="250" Margin="25,0,10,0" ItemsSource="{Binding DetacheringenEmployeesModel}" IsReadOnly="True" ColumnHeaderStyle="{DynamicResource CustomColumnHeader}" AutoGenerateColumns="False" RowHeight="30">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonUp">
                     <i:InvokeCommandAction Command="{Binding EmployeeGrid_MouseLeftButtonUp}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
    <DataGrid.Columns>
    

    View.xaml.cs (code-behind):

    public partial class UC1001_DashBoardConsultants_View
    {
        public UC1001_DashBoardConsultants_View(UC1001_DashboardConsultantViewModel viewModel)
        {
                InitializeComponent();
                DataContext = viewModel;
        }
    }
    

    ViewModel.cs:

     public void EmployeeGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
     {
         // insert logic here
     }
    

    The main idea is, when I click on a cell in the DataGrid, the event will fire. I first tried it in the code behind, and it worked. I got so far with the EventTriggers, but when I debug and click on a cell, my debugger doesn't come into the method.

    Does anyone have an idea how to fix this? Thanks in advance!

    PS: Does it also work with the (object sender) parameter when I do it like that? Because I need the DataGrid in my ViewModel to get the ActiveCell I just clicked on.

    EDIT:

    The event-binding worked with the Command!

    I have this in my DataGrid:

    <DataGridTextColumn Header="Okt" Width="*" x:Name="test" >
         <DataGridTextColumn.ElementStyle>
               <Style TargetType="{x:Type TextBlock}">
                 <Setter Property="Tag" Value="{Binding Months[9].AgreementID}"/>
    

    How can I bind the Tag property to the ViewModel? I know it's already bound from the ViewModel, but as you can see the value comes from an Array/List and per column the value is different.

  • Jelle Capenberghs
    Jelle Capenberghs over 11 years
    Thanks, that worked perfectly! Do you also have a suggestion to pass the DataGrid along with the command (as a parameter or something) so I can access it in my ViewModel?
  • sll
    sll over 11 years
    @Jelle Capenberghs : no, passing an entire UI container in ViewModel is not the MVVM approach, ViewModel should not know anything about specific UI implementation (today you're usign rid, but perhaps tomorrow - TreeView so ViewModel has to be refactored, this is wrong). What are you trying to do in this command?
  • Jelle Capenberghs
    Jelle Capenberghs over 11 years
    I need to get the Cell I clicked in my ViewModel because the Cell contains a TextBlock with information I need in the ViewModel. - Already marked as answer because the ICommand was primarly what I needed!
  • sll
    sll over 11 years
    I would suggest binding text itself <TextBox Text="{Binding ViewModelProperty}" > rather than such complext scenario with events
  • Fandi Susanto
    Fandi Susanto over 9 years
    Could someone please tell me what namespace is "i"?
  • sll
    sll over 9 years
    Google for "Interaction.Behavuiours"