2011-10-28 20 views
7

Korzystam z ram WPF i PRISM dla mojej aplikacji. Wzorzec, którego używam, to MVVM (Model - Widok - ViewModel) i próbuję przenieść zdarzenie MouseLeftButtonUp z kodu z tyłu w widoku do ViewModel (aby zdarzenie było zgodne z regułami MVVM). Na razie mam to:Powiąż zdarzenia do 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-tył):

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 
} 

Główną ideą jest, że po kliknięciu komórki w DataGrid wydarzenie się uruchomi. Najpierw wypróbowałem to w kodzie, i zadziałało. Dotarłem do tej pory z EventTriggerami, ale kiedy debuguję i klikam komórkę, mój debugger nie wchodzi w tę metodę.

Czy ktoś ma pomysł, jak to naprawić? Z góry dziękuję!

PS: Czy działa również z parametrem (obiekt nadawcy), gdy robię to w ten sposób? Ponieważ potrzebuję DataGrid w moim ViewModelu, aby uzyskać ActiveCell, który właśnie kliknąłem.

EDIT:

Impreza wiążące pracował z poleceniem!

mam to w moim DataGrid:

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

Jak mogę powiązać właściwość tag do ViewModel? Wiem, że jest już związany z ViewModel, ale jak widać wartość pochodzi z tablicy/listy i na kolumnę wartość jest inna.

Odpowiedz

10

InvokeCommandAction wymaga, aby ICommand była związana, a nie związana z obsługą zdarzeń (EmployeeGrid_MouseLeftButtonUp).

Więc można wprowadzać polecenia w ViewModel i wiążą się z nim:

Widok Model:

public ICommand SomeActionCommand { get; set; } 

XAML:

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

Dzięki, że pracował idealnie! Czy masz również sugestię, aby przekazać DataGrid wraz z poleceniem (jako parametr lub coś podobnego), aby uzyskać do niego dostęp w moim ViewModelu? –

+0

@Jelle Capenberghs: nie, przekazanie całego kontenera UI w ViewModel nie jest podejściem MVVM, ViewModel nie powinien nic wiedzieć o konkretnej implementacji interfejsu użytkownika (dziś nie używasz go, ale może jutro - TreeView, więc ViewModel musi być refaktoryzowany, to jest źle). Co próbujesz zrobić w tym poleceniu? – sll

+0

Potrzebuję uzyskać komórkę, którą kliknąłem w moim ViewModelu, ponieważ komórka zawiera TextBlock z informacjami, których potrzebuję w ViewModelu. - Już oznaczony jako odpowiedź, ponieważ ICommand była przede wszystkim tym, czego potrzebowałem! –

Powiązane problemy