2011-10-28 3 views
7

내 응용 프로그램에 WPF 및 PRISM 프레임 워크를 사용하고 있습니다. 내가 사용하고있는 패턴은 MVVM (Model - View - ViewModel)이고 MVVM 규칙에 따라 이벤트가 표시되도록 View의 코드 숨김에서 MouseLeftButtonUp 이벤트를 ViewModel로 가져 오려고합니다.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 :

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 
} 

지금 나는이 있습니다 주요 아이디어는 DataGrid에서 셀을 클릭하면 이벤트가 실행된다는 것입니다. 먼저 코드에서 시도해 보았습니다. 지금까지 EventTriggers를 가지고 있었지만 셀을 디버그하고 클릭하면 디버거가 메서드에 포함되지 않습니다.

누구든지 해결 방법을 알고 있습니까? 미리 감사드립니다!

추신 : 내가 그렇게 할 때 (개체 발신자) 매개 변수와도 작동합니까? 방금 클릭 한 ActiveCell을 얻으려면 ViewModel에 DataGrid가 필요합니다.

편집 :

이 이벤트 바인딩이 명령과 함께 일했다!

내 데이터 그리드이 있습니다

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

은 어떻게 뷰 모델에 태그 속성을 바인딩 할 수 있습니다? ViewModel에서 이미 바인딩 된 것을 알지만 배열/목록 및 열마다 값이 달라지는 것을 볼 수 있습니다.

답변

10

InvokeCommandAction은 바인딩 한대로 이벤트 핸들러가 아닌 (EmployeeGrid_MouseLeftButtonUp) ICommand이 필요합니다.

그래서 당신은 뷰 모델에서 명령을 소개하고 결합 할 수 있습니다

보기 모델 :

public ICommand SomeActionCommand { get; set; } 

가 XAML :

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

감사합니다, 즉 완벽하게 작동! 또한 ViewModel에서 데이터 그리드에 액세스 할 수 있도록 (매개 변수 등으로) 명령과 함께 DataGrid를 전달하라는 제안이 있습니까? –

+0

@ Jelle Capenberghs : 아니요, ViewModel의 전체 UI 컨테이너를 전달하는 것은 MVVM 접근 방식이 아닙니다. ViewModel은 특정 UI 구현에 대해 알지 않아야합니다. (현재는 사용을 제외하고 있지만 내일 - TreeView이므로 ViewModel을 리팩토링해야합니다. 잘못된 것입니다.) 이 명령에서 무엇을하려고합니까? – sll

+0

ViewModel에 필요한 정보가있는 TextBlock이 셀에 포함되어 있으므로 ViewModel에서 클릭 한 셀을 가져와야합니다. - ICommand가 원초적으로 필요했기 때문에 이미 답변으로 표시되었습니다! –

관련 문제