2011-10-28 23 views
7

Estoy usando WPF y framework PRISM para mi aplicación. El patrón que estoy usando es MVVM (Model - View - ViewModel) y estoy tratando de llevar el evento MouseLeftButtonUp desde el código subyacente en la Vista al ViewModel (para que el evento cumpla con las reglas de MVVM). Por ahora tengo esto:Evento de enlace a ViewModel

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 (código subyacente):

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 
} 

La idea principal es que cuando hago clic en una celda en DataGrid, el evento se activará. Lo intenté por primera vez en el código subyacente, y funcionó. Llegué tan lejos con EventTriggers, pero cuando depuro y hago clic en una celda, mi depurador no entra en el método.

¿Alguien tiene una idea de cómo solucionar esto? ¡Gracias por adelantado!

PD: ¿Funciona también con el parámetro (remitente del objeto) cuando lo hago así? Porque necesito DataGrid en mi ViewModel para obtener el ActiveCell en el que acabo de hacer clic.

EDIT:

El evento vinculante trabajaron con el Comando!

tengo esto en mi DataGrid:

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

Como puedo obligar a la propiedad Tag para el modelo de vista? Sé que ya está vinculado a ViewModel, pero como puede ver, el valor proviene de una matriz/lista y por columna el valor es diferente.

Respuesta

10

InvokeCommandAction requiere que el ICommand no se vincule a un controlador de eventos como el que ha vinculado (EmployeeGrid_MouseLeftButtonUp).

Así se puede introducir un comando en el modelo de vista y se unen a ella:

Ver Modelo:

public ICommand SomeActionCommand { get; set; } 

XAML:

<i:InvokeCommandAction Command="{Binding SomeActionCommand}" /> 
+0

Gracias, que funcionó a la perfección! ¿También tiene una sugerencia para pasar el DataGrid junto con el comando (como un parámetro o algo así) para que pueda acceder a él en mi ViewModel? –

+0

@Jelle Capenberghs: no, pasar un contenedor de UI completo en ViewModel no es el enfoque de MVVM, ViewModel no debería saber nada sobre la implementación de UI específica (hoy está listo deshacerse, pero tal vez mañana, TreeView, por lo que ViewModel tiene que ser refactorizado, Está Mal). ¿Qué estás tratando de hacer en este comando? – sll

+0

Necesito obtener la celda en la que hice clic en mi ViewModel porque la celda contiene un TextBlock con la información que necesito en ViewModel. - ¡Ya marcado como respuesta porque el ICommand era básicamente lo que necesitaba! –

Cuestiones relacionadas