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?
risposta
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.
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;
}
Grazie, Rafal, quel trucco ha aiutato. Grazie! –
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
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
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;
}
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
}
}
Puoi mostrare qualche codice di esempio che cosa stai cercando di ottenere? –