2011-10-28 17 views
7

Utilizzo la struttura WPF e PRISM per la mia applicazione. Lo schema che sto usando è MVVM (Model - View - ViewModel) e sto cercando di portare l'evento MouseLeftButtonUp dal code-behind nella View a ViewModel (quindi l'evento sarà conforme alle regole MVVM). Per ora ho questo:Evento di collegamento 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 (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 
} 

L'idea principale è che quando faccio clic su una cella in DataGrid, l'evento si attiva. L'ho provato per la prima volta nel codice, e ha funzionato. Sono arrivato così lontano con EventTriggers, ma quando eseguo il debug e clicco su una cella, il mio debugger non entra nel metodo.

Qualcuno ha un'idea di come risolvere il problema? Grazie in anticipo!

PS: Funziona anche con il parametro (oggetto mittente) quando lo faccio in quel modo? Perché ho bisogno del DataGrid nel mio ViewModel per ottenere l'ActiveCell su cui ho appena fatto clic.

EDIT:

L'evento vincolante lavorato con il comando!

ho questo nel mio DataGrid:

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

Come posso associare la proprietà Tag al ViewModel? So che è già associato a ViewModel, ma come puoi vedere il valore proviene da una matrice/elenco e per colonna il valore è diverso.

risposta

10

InvokeCommandAction richiede che lo ICommand non venga associato a un gestore di eventi come si è associato (EmployeeGrid_MouseLeftButtonUp).

Così si può introdurre un comando nel ViewModel e si legano ad essa:

Vista Modello:

public ICommand SomeActionCommand { get; set; } 

XAML:

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

Grazie, che ha funzionato perfettamente! Hai anche un suggerimento per passare il DataGrid insieme al comando (come parametro o qualcosa del genere) così posso accedervi nel mio ViewModel? –

+0

@Jelle Capenberghs: no, passare un intero contenitore dell'interfaccia utente in ViewModel non è l'approccio MVVM, ViewModel non dovrebbe sapere nulla dell'implementazione specifica dell'interfaccia utente (oggi ci si può sbarazzare, ma forse domani - TreeView in modo che ViewModel debba essere refactored, questo è sbagliato). Cosa stai cercando di fare in questo comando? – sll

+0

Ho bisogno di ottenere la cella che ho cliccato nel mio ViewModel perché la cella contiene un TextBlock con le informazioni che ho bisogno nel ViewModel. - Già contrassegnato come risposta perché l'ICommand era primariamente quello di cui avevo bisogno! –

Problemi correlati