2011-08-28 20 views
7

Uso un oggetto ItemsControl per visualizzare un elenco di elementi del database, per ciascuno il nucleo del DataTemplate è una griglia su cui sono stati posizionati tutti i controlli associati.Elementi selezionabili Elemento di controllo in WPF

Vorrei poter fare clic sull'intera area per ogni elemento nell'elenco. Ma non riesco a capire come rendere l'area cliccabile.

Qualsiasi suggerimento su come rendere selezionabile un'intera area della griglia sarebbe fantastico.

+0

cosa causa esattamente questo problema? sto cercando di capire perché questo succede. Un clic su un elemento non dovrebbe comportare un evento del mouse di anteprima che scava l'albero verso il treeviewitem? o treeviewitem non è il focus dell'evento del mouse? Ho pensato che gli eventi del mouse sono stati generati in base al test di successo che avrebbe ottenuto l'elemento più interno nell'albero visivo (che presumo sarebbe il treeviewitem) e poi renderò il bersaglio dell'evento –

risposta

4

È possibile utilizzare lo AttachedCommandBehavior classes from C# Disciples per ottenere ciò.

Definire un comando in ViewModel, quindi sull'oggetto Grid utilizzare ACB AllegateProperties per associare l'evento MouseLeftButtonUp al comando.

Alcuni codice per iniziare:

 <Grid Name="grid" Height="30" ForceCursor="True" Cursor="Hand"> 
      <acb:CommandBehaviorCollection.Behaviors> 
       <acb:BehaviorBinding Event="MouseLeftButtonUp" Command="{Binding Path=DataContext.EditEventCommand, RelativeSource={RelativeSource AncestorType={x:Type self:Dashboard}}}" CommandParameter="{Binding}" /> 
      </acb:CommandBehaviorCollection.Behaviors> 
     </Grid> 

Modifica per soluzione non MVVM.

Il frammento di codice sopra riportato funzionerà ancora quando non hai progettato la tua applicazione seguendo le linee guida MVVM poiché in pratica stai semplicemente vincolando ad un comando nel code-behind.

Tuttavia, se non si vuole andare alla difficoltà di definire comandi, è possibile specificare semplicemente un evento per agganciare a, in questo modo:

<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp"> nel file XAML.

e nel code-behind:

private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
    }   
+0

Funziona ancora se non sto usando MVVM? (Onestamente non so come ancora ...) –

+0

Sì, funzionerà ancora quando non si utilizza MVVM, ma ho aggiornato la mia risposta con un po 'di codice aggiuntivo. Nota che questo si innescherà su MouseUp, non su Click. Se si desidera attivare il clic, è necessario acquisire gli eventi MouseDown e Up, avviare un timer per misurare il tempo impiegato tra ciascuno e quindi attivarlo di conseguenza. – fatty

14

di fare qualcosa di cliccabile di solito si può avvolgerlo in un pulsante, se deve essere "invisibile", è possibile modificare il modello:

<Button.Template> 
    <ControlTemplate TargetType="{x:Type Button}"> 
     <ContentPresenter /> 
    </ControlTemplate> 
</Button.Template> 
+1

+1: Per la vita di me, non posso credere che in quattro anni ho scritto in XAML non ho mai pensato di farlo. – fatty

+0

@fatty: Oh wow; io per primo non posso credere che la maggior parte dei controlli abbia tutti i tipi di eventi del mouse ma non un semplice clic, forse pensavano che il pulsante sarebbe stato inutile in quanto tutto può essere in ogni caso designato come uno ([sarebbe una mia domanda correlata] (http://stackoverflow.com/questions/4830164/what-is-the-best-way-to-simulate-a-click-with-mouseup-mousedown-events-or-other)) –

+0

Bello, è pazzesco pensare a quanto bloccato nella tua storia puoi ottenere quando fai la stessa cosa più e più volte. Non vedo l'ora che riesca a ottenere una discreta 'connessione netta da sotto questa roccia che mi sembra di vivere sotto. – fatty

Problemi correlati