2011-05-11 14 views
11

Eğer bir davranış olmadan bir komuta doğrudan Etkinlik bağlamak olamaz bildiği gibi:Bir stilin EventTrigger içinde bir Komutu Atma?

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

Ancak bu şimdi Cell çift tıklamak yerine DataGrid kendisini tıklayarak çift bu refactor mükemmel iyi olması işleri . Böyle Hücre Stili içeride şimdi bu behviour tanımlamak umuyordum

(Hücre tıklandığı umurumda değil):

<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> 

Ama yukarıdan davranış getirecek ateşe nasıl komut? Son derece takdir

,

+0

Çoktan bu yinelemede, stillerdeki davranışları tanımlamakla ilgili bir kaç kopya var. Kısacası: En azından çok sayıda karmaşık kod-çemberden geçmeden yapamazsınız. EventToCommand davranışını seviyorum, ancak bu gibi durumlarda her zaman viewmodel komutunu yürüten görünümde yöntem işleyicisi ile düzenli bir EventSetter ile gitmek zorunda kaldım. Kirli hissettiriyor, nükleer kontrolün tamamı ile çirkin görünüyor, ancak bu "çözümler" e bakmış olsanız da, kendinizi büyük bir uygulamada bu tonlarca çalışmayacağınız sürece hala daha basittir. –

cevap

7

Eğer DataGridCell retemplating olduğundan, kontrol şablonunda kök elemana tetikleyicileri ekleyebilir. Bir şey gibi: Bir sürümü Thats

<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

Kod oluştururken, belirtilmemiş bir yerde bulunduğu için DataContext'i doğru alamıyorum. Bunu başarılı olmadan bile denedim: Houman

+1

@Kave - Try: Command = "{Ayırıcı DataContext.TradeEntryCommand, RelativeSource = {RelativeSource FindAncestor, AncestorType = Görüntüleme Sayısı: MainWindow}} " – CodeNaked

2

Ben DataGridRow içinde benzer bir durumda (Button Düğme-komut için kullanıyorum, DataGrid üzerinde komut düğmesi tarafından çağrılması gereken ve benim komuta satırın DataContext'i gerek). Bunun yerine, DoubleClick-tetikleyicinin InvokeCommandAction komutunu kullanmanız gerekir, ancak daha sonra da çalışması gerekir.

İyi şanslar!

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

    </TextBlock> 
</DataTemplate>  
İlgili konular