Chciałbym obsłużyć zdarzenie SelectionChanged w elemencie WPF DataGrid tylko dla interakcji/wyboru użytkownika i pominąć, jeśli jest to spowodowane wiązaniem lub innymi ustawionymi wartościami. Masz pomysł, jak ustalę, czy wybór został zmieniony przez interakcję z użytkownikiem? Lub jakieś alternatywne wydarzenie, które wykonałoby podobne zadanie?Czy zdarzenie SelectionChanged w WPF może być obsługiwane tylko w celu interakcji użytkownika?
Odpowiedz
Może spróbuj połączyć zdarzenie SelectionChanged
z wydarzeniem PreviewMouseDown
. Gdy użytkownik kliknie wiersz, ustawiasz określoną właściwość, aw przypadku obsługi zdarzenia SelectionChanged
sprawdź, czy nie została zmieniona właściwość.
Próbka XAML:
<DataGrid SelectionChanged="OnSelectionChanged" PreviewMouseDown="OnPreviewMouseDown">
<!--some code-->
</DataGrid>
Kod za:
bool isUserInteraction;
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (isUserInteraction)
{
//some code
isUserInteraction = false;
}
}
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
isUserInteraction = true;
}
Dziękuję Rafał, ta sztuczka pomogła. Dziękuję Ci! –
Czy ktoś może pomyśleć o przyczynie, dlaczego nie jest to realizowane jako osobne wydarzenie ...? Używając MVVM-Pattern zmiana zawsze wyzwala się nawet przy ustawianiu datacontext ....:/+1 Rafał dla tej sztuczki ':) – dba
Myślę, że to się nie powiedzie w wielu przypadkach: (1) jeśli użytkownik kliknął w sposób które nie spowodowało zmiany wyboru (np. kliknięcie już wybranego wiersza lub użycie modyfikatorów lub innych przycisków myszy), a wybór zmienia się z powodu powiązania, wiązanie będzie widoczne jako działanie użytkownika. (2) Jeśli użytkownik użyje klawiatury do zmiany wyboru, nie będzie to postrzegane jako działanie użytkownika. – hypehuman
hi można to wykorzystać w 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>
oraz w kodzie za:
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!((ComboBox)sender).IsEditable) return;
//Do Stuff;
}
Inną metodą byłoby obsłużenie zdarzeń DropDownOpened
i DropDownClosed
w ComboBox. Jest to nieco lepsze od przyjętej odpowiedzi Rafała, ponieważ zapobiega to zablokowaniu flagi boolowskiej jako true, jeśli użytkownik kliknął ComboBox, a następnie kliknął gdzieś indziej, powodując zamknięcie ComboBox bez dokonania selekcji. Nie rozwiązuje jednak problemu, jeśli ComboBox ma fokus na klawiaturze, a użytkownik naciska strzałki w górę i w dół, aby zmienić zaznaczenie.
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
}
}
- 1. Jak obsługiwać zdarzenie SelectionChanged z ComboBox przy MVVM w wpf?
- 2. Jak anulować zdarzenie ComboBox SelectionChanged?
- 3. W C# WPF, dlaczego moje zdarzenie SelectionChanged w TabControl jest uruchamiane zbyt często?
- 4. Intellisense obsługiwane TextBox w WPf
- 5. Wykrywanie twarzy w Androidzie bez interakcji użytkownika
- 6. Czy REST w praktyce może być bezpaństwowcem?
- 7. Wyświetlane zdarzenie okna w WPF?
- 8. Wyłączanie zawijania wyjątków WPF w celu debugowania
- 9. Funkcja FileReference.save() Flexa może być wywołana tylko w procedurze obsługi zdarzeń użytkownika - jak mogę obejść ten problem?
- 10. SelectionChanged wiążące w Silverlight + MVVM-Light
- 11. Czy javascript może być wbudowany w WebPacka?
- 12. Czy EntryElement może być wieloliniowy w MonoTouch.Dialog?
- 13. Czy metoda w klasie może być generatorem?
- 14. Czy to może być rekurencyjne w Prologu?
- 15. Czy zakres może być dopasowany w Scali?
- 16. Wyrażenie regularne w celu sprawdzenia, czy ciąg zawiera tylko zera
- 17. GroupBox w WPF może zawierać tylko jeden element?
- 18. error: Etykieta może być tylko częścią oświadczenia
- 19. Czy Android AsyncTask doInBackground może być zsynchronizowany w celu serializacji wykonania zadania?
- 20. Metoda WebSecurity.InitializeDatabaseConnection może być wywołana tylko raz.
- 21. php: // wejście może być odczytane tylko raz w PHP 5.6.16
- 22. Android, wyłącz przesuwanie w celu interakcji z SlidingPaneLayout
- 23. Rozszerzanie kontroli użytkownika w WPF
- 24. blokowanie interakcji użytkownika z widokami podstawowymi
- 25. Rozwój iphone: wyłączanie interakcji użytkownika podczas animacji
- 26. Funkcja może być wywołana tylko w głównym wątku, dlaczego?
- 27. Czy JavaScript może być bootowany?
- 28. Zdarzenie dla akcji MouseOver w WPF
- 29. Microsoft.Practices.EnterpriseLibrary.Data.DLL ale nie było obsługiwane w kodzie użytkownika
- 30. Jak obsługiwać zdarzenie zmiany Canvas.Top w WPF?
Czy możesz pokazać przykładowy kod, który próbujesz osiągnąć? –