2011-05-11 3 views
11

당신은 당신이 행동하지 않고 명령에 직접 이벤트를 바인딩 할 수 없습니다 알다시피 :스타일의 EventTrigger에서 명령 실행?

<DataGrid> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="PreviewMouseDoubleClick"> 
      <i:InvokeCommandAction Command="{Binding TradeEntryCommand"} /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</DataGrid> 

이, 그러나 지금은 셀을 클릭 두 번하는 데이터 그리드 자체를 더블 클릭에서이 리팩토링 완벽하게 잘해야 작품 . 나는이 같은 셀 스타일의 내부 지금이 behviour를 정의하는 기대했다

(I는 셀을 클릭 한 상관 없어) :

<Style x:Key="DefaultCellStyleBase" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <ControlTemplate.Triggers> 
        <EventTrigger RoutedEvent="PreviewMouseDoubleClick"> 
         ????????? 
        </EventTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <!-- ... --> 
</Style> 

하지만 위에서 동작에 가져다 줄 것은 불하는 방법 명령? 매우 감사

,

+0

스타일의 동작을 정의하는 것과 관련하여 이미 너무 많은 부분이 있습니다. 간단히 말해서, 적어도 복잡한 코드 - 홉을 뛰어 넘지 않고서는 안됩니다. EventToCommand 동작을 좋아하지만, 이와 같은 경우에는 viewmodel 명령을 실행하는보기에서 항상 메서드 처리기가있는 일반 EventSetter를 사용해야했습니다. 더러워진 것 같아요, 널 검사와 관련해서는보기 흉하게 보입니다. 그러나이 "솔루션"을 살펴보면 큰 응용 프로그램에서이 시간대에 자신을 발견하지 않는 한 아마 더 간단 할 것입니다. –

답변

7

것은 당신이 DataGridCell을 retemplating하고 있기 때문에, 당신은 컨트롤 템플릿의 루트 요소에 트리거를 추가 할 수 있습니다. 뭔가 같은 : 버전 그게 전부

<ControlTemplate TargetType="{x:Type DataGridCell}"> 
    <Grid x:Name="root" Background="Transparent"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="PreviewMouseDoubleClick"> 
       <i:InvokeCommandAction Command="{Binding TradeEntryCommand}" /> 
      </i:EventTrigger>        
     </i:Interaction.Triggers> 
    </Grid> 
</ControlTemplate> 
+0

코드가 빌드되는 동안, 내가 지정하지 않은 어딘가에 위치하므로 DataContext를 올바르게 가져올 수 없습니다. 나는 성공하지 않고 이것을 시도하기까지했다 : Houman

+1

@Kave - 시도 : Command ="{Binding DataContext.TradeEntryCommand, RelativeSource = {RelativeSource FindAncestor, AncestorType =보기 : MainWindow}} " – CodeNaked

2

내가 DataGridRow에서 비슷한 상황 (버튼의 버튼-명령 사용하고, 데이터 그리드에 대한 명령은 버튼에 의해 호출되어야하고 내 명령 행의 DataContext에 필요). 대신에 doubleClick-trigger의 InvokeCommandAction 명령을 사용해야 만하지만 잘 작동해야합니다.

행운을 빈다.

<DataTemplate> 
      <TextBlock>        
      <Button x:Name="cmdButton"        
            Command="{Binding Path=DataContext.CommandNameInViewModel, 
             RelativeSource={RelativeSource AncestorType={x:Type TypeOfAncestorWithTheViewModel}}}" 
            CommandParameter="{Binding}" >  
            Do something 
     </Button> 

    </TextBlock> 
</DataTemplate>