2013-01-13 13 views
6

Mi piacerebbe gestire l'evento SelectionChanged nell'elemento WPF DataGrid solo per l'interazione/selezione dell'utente e saltare se è dovuto al binding o ad altri valori impostati. Qualche idea su come determinerò se la selezione viene modificata dall'interazione dell'utente? O qualsiasi evento alternativo che farebbe un compito simile?l'evento SelectionChanged in WPF può essere gestito solo per l'interazione dell'utente?

+0

Puoi mostrare qualche codice di esempio che cosa stai cercando di ottenere? –

risposta

10

Forse prova a combinare l'evento SelectionChanged con l'evento PreviewMouseDown. Quando l'utente fa clic su una riga, imposta alcune proprietà e nel gestore di eventi SelectionChanged controlla se la proprietà è stata modificata.

codice

di esempio XAML:

<DataGrid SelectionChanged="OnSelectionChanged" PreviewMouseDown="OnPreviewMouseDown"> 
     <!--some code-->   
</DataGrid> 

codice dietro:

bool isUserInteraction; 

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (isUserInteraction) 
    { 
     //some code 

     isUserInteraction = false; 
    } 
} 

private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    isUserInteraction = true; 
} 
+0

Grazie, Rafal, quel trucco ha aiutato. Grazie! –

+0

Qualcuno può pensare a un motivo, perché questo non è implementato come evento separato ...? Usando MVVM-Pattern la modifica si attiva sempre anche sull'impostazione del datacontext ....:/+1 Rafal per questo trucco ':) – dba

+0

Penso che questo non funzionerà in molti casi: (1) se l'utente ha fatto clic in un modo ciò non ha comportato una modifica della selezione (ad esempio facendo clic su una riga già selezionata, o utilizzando modificatori o pulsanti del mouse diversi), quindi la selezione cambia a causa di un'associazione, l'associazione verrà vista come un'azione dell'utente. (2) Se l'utente usa la tastiera per cambiare la selezione, non sarà vista come un'azione dell'utente. – hypehuman

0

hi è possibile utilizzare questo in XAML:

<ComboBox x:Name="ComboBoxName" SelectionChanged="ComboBox_SelectionChanged"> 
             <ComboBox.Style> 
              <Style TargetType="ComboBox"> 
               <Style.Triggers>              
                <Trigger Property="IsDropDownOpen" Value="True"> 
                 <Setter Property="IsEditable" Value="True"></Setter> 
                </Trigger> 
               </Style.Triggers> 
              </Style> 
             </ComboBox.Style> 
            </ComboBox> 

e nel codice dietro:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (!((ComboBox)sender).IsEditable) return; 
     //Do Stuff; 
    } 
0

Un altro metodo sarebbe quello di gestire gli eventi DropDownOpened e DropDownClosed di ComboBox. Questo è leggermente migliore della risposta accettata di Rafal perché impedisce che la bandiera booleana rimanga bloccata come vera se l'utente fa clic sul ComboBox e poi fa clic da qualche altra parte causando la chiusura del ComboBox senza che venga fatta una selezione. Ciò che non risolve, tuttavia, è se il ComboBox ha il focus della tastiera e l'utente tocca le frecce su e giù per cambiare la selezione.

private void Event_ComboBox_DropDownOpened(object sender, EventArgs e) 
{ 
    isUserInteraction = true; 
} 

private void Event_ComboBox_DropDownClosed(object sender, EventArgs e) 
{ 
    isUserInteraction = false; 
} 

private void Event_ComboBox_SelectedChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (isUserInteraction) 
    { 
     // Do work 
    } 
}