2013-01-13 6 views
6

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?

+0

Czy możesz pokazać przykładowy kod, który próbujesz osiągnąć? –

Odpowiedz

10

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ść.

kod

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; 
} 
+0

Dziękuję Rafał, ta sztuczka pomogła. Dziękuję Ci! –

+0

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

+0

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

0

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; 
    } 
0

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 
    } 
} 
Powiązane problemy