2013-03-21 4 views
5

Wiem, że to pytanie zostało zadane wcześniej, ale nie mogłem znaleźć tego, czego szukam.Jak anulować wybór datagridów zmieniono wydarzenie w WPF?

private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

if (oOrdItem.ItemNo == 0) 
       { 
        e.Handled = true; 
        MessageBox.Show("Please save the order item", "Save"); 
        return; 
       } 
} 

Nawet jeśli zadzwonię e.Handled = true; będzie wybrać wiersz DataGrid. Nie chcę dzwonić pod numer dataGrid1.SelectedIndex =-1;, ponieważ spowoduje to ponowne wywołanie zdarzenia selection. Próbowałem też dataGrid1.UnSelectAll(); W jaki inny sposób anulować zdarzenie selectionchanged?

Odpowiedz

0

Czy myślisz o alternatywnej realizacji? Zastanawiam się nad Binding i metodą sprawdzania przed zmianą SelectedItem. Ilustrację:

<DataGrid ItemsSource="..." SelectedItem="{Binding SelectedEntry}" /> 

i podstawowa VM może wyglądać następująco:

public class SampleVm : ViewModelBase//assuming that you are using such a base class 
{ 
    private object _selectedEntry; 
    public object SelectedEntry 
    { 
     get { return _selectedEntry; } 
     set 
     { 
      if (!SavePrevItem()) 
       return; 

      _selectedEntry = value; 
      RaisePropertyChanged("SelectedItem"); // or something similar 
     } 
    } 

    private bool SavePrevItem() 
    { 
     // your logic here 
    } 
} 
+1

Czy na pewno to zadziała? Myślę, że wybór zostanie zmieniony, ale SelectedEntry nie – Demarsch

1

Używałem różnych metod, aby spróbować, aby anulować wybór zmieniło zdarzenie, w tym metodę od wybranej odpowiedzi, ale żaden z nich nie działał. To jednak pracował wielki dla mnie:

Używanie PreviewMouseDown zdarzeń obsługi dla DataGrid:

private void dataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    //get the item I am clicking on (replace MyDataClass with datatype in datagrid) 
    var myItem = (e.OriginalSource as FrameworkElement).DataContext as MyDataClass; 

    //check if item is different from currently selected item 
    if (myItem != dataGrid.SelectedItem) 
    { 
     //save message dialog 
     MessageBoxResult result = MessageBox.Show("Changes will be lost. Are you sure?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Question); 

     //if click no, then cancel the event 
     if (result == MessageBoxResult.No) 
     { 
      e.Handled = true; 
     } 
     else 
     { 
      //otherwise, reinvoke the click event 
      dataGrid.Dispatcher.BeginInvoke(
       new Action(() => 
       { 
       RoutedEventArgs args = new MouseButtonEventArgs(e.MouseDevice, 0, e.ChangedButton); 
       args.RoutedEvent = UIElement.MouseDownEvent; 
       (e.OriginalSource as UIElement).RaiseEvent(args); 
       }), 
       System.Windows.Threading.DispatcherPriority.Input); 
      } 
     } 
    } 
} 

to z powodzeniem utrzymuje bieżący wiersz wybrany, gdy użytkownik kliknie „Nie”, a jeśli kliknij " Tak ", wtedy wykonanie będzie kontynuowane jak zwykle. Mam nadzieję, że pomoże to komuś w przyszłości, ponieważ znalezienie czegoś, co zadziałałoby dla pozornie prostego problemu, zajęło dużo czasu.