2011-10-28 41 views
7

Tôi đang sử dụng khung công tác WPF và PRISM cho ứng dụng của mình. Các mô hình tôi đang sử dụng là MVVM (Model - View - ViewModel) và tôi đang cố gắng mang lại sự kiện MouseLeftButtonUp từ code-behind trong View to the ViewModel (vì vậy sự kiện sẽ theo các quy tắc MVVM). Để bây giờ tôi có điều này:Sự kiện liên kết với 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 
} 

Ý tưởng chính là, khi tôi nhấp vào một ô trong DataGrid, sự kiện sẽ kích hoạt. Lần đầu tiên tôi thử nó ở đoạn mã phía sau, và nó hoạt động. Tôi đã nhận được cho đến nay với EventTriggers, nhưng khi tôi gỡ lỗi và bấm vào một tế bào, trình gỡ lỗi của tôi không đi vào phương pháp.

Có ai có ý tưởng cách sửa lỗi này không? Cảm ơn trước!

PS: Tính năng này có hoạt động với tham số (đối tượng người gửi) khi tôi làm như vậy không? Bởi vì tôi cần DataGrid trong ViewModel của mình để lấy ActiveCell mà tôi vừa mới nhấp vào.

EDIT:

Sự kiện ràng buộc làm việc với Bộ Tư lệnh!

Tôi có điều này trong DataGrid của tôi:

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

Làm thế nào tôi có thể ràng buộc thuộc tính Tag đến ViewModel? Tôi biết nó đã bị ràng buộc từ ViewModel, nhưng như bạn có thể thấy giá trị đến từ một mảng/danh sách và mỗi cột giá trị khác nhau.

Trả lời

10

InvokeCommandAction yêu cầu ICommand để bị ràng buộc không phải là trình xử lý sự kiện khi bạn đã ràng buộc (EmployeeGrid_MouseLeftButtonUp).

Vì vậy, bạn có thể giới thiệu một lệnh trong ViewModel và liên kết với nó:

Xem mẫu:

public ICommand SomeActionCommand { get; set; } 

XAML:

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

Cảm ơn, mà làm việc một cách hoàn hảo! Bạn cũng có một đề nghị để vượt qua DataGrid cùng với lệnh (như một tham số hoặc một cái gì đó) để tôi có thể truy cập nó trong ViewModel của tôi? –

+0

@Jelle Capenberghs: không, bỏ qua toàn bộ vùng chứa UI trong ViewModel không phải là cách tiếp cận MVVM, ViewModel không biết gì về việc thực hiện UI cụ thể (hôm nay bạn đang loại bỏ, nhưng có lẽ ngày mai - TreeView để ViewModel phải được refactored, là sai). Bạn đang cố gắng làm gì trong lệnh này? – sll

+0

Tôi cần lấy Cell mà tôi đã nhấn vào ViewModel vì Cell chứa một TextBlock với thông tin tôi cần trong ViewModel. - Đã được đánh dấu là câu trả lời vì ICommand là những gì tôi cần! –

Các vấn đề liên quan