2013-03-21 7 views
5

Ich weiß, dass diese Frage vor gefragt wird, aber ich konnte nicht finden, nach was ich suche.Wie storniert Datagrid Auswahl Ereignis in WPF geändert?

private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

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

Auch wenn ich e.Handled = true; nennen es die Datagrid-Zeile auswählen. Ich möchte nicht dataGrid1.SelectedIndex =-1; aufrufen, weil es selectionchangeed Ereignis wieder auslöst. Ich habe auch versucht dataGrid1.UnSelectAll(); Jede andere Möglichkeit, das selectionchanged Ereignis abzubrechen?

Antwort

0

Haben Sie über eine alternative Implementierung nachgedacht? Ich denke an Binding und eine Prüfmethode vor dem Ändern der SelectedItem. Eine Abbildung:

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

und die darunter liegende VM könnten wie folgt aussehen:

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

Sind Sie sicher, dass dies funktioniert? Ich denke, die Auswahl wird geändert, aber SelectedEntry nicht – Demarsch

1

ich eine Vielzahl von Methoden verwendet, um zu versuchen, die Auswahl geändert Veranstaltung abzusagen, einschließlich der Methode aus der gewählten Antwort, aber keiner von ihnen hat funktioniert. Dies ist jedoch für mich groß ist:

den Preview Event-Handler für das Datagrid verwenden:

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

Dies hält erfolgreich die aktuelle Zeile ausgewählt, wenn der Benutzer klickt auf „Nein“, und wenn sie auf " Ja ", dann wird die Ausführung normal fortgesetzt. Hoffentlich hilft das jemandem in der Zukunft, weil es lange gedauert hat, etwas zu finden, das für ein scheinbar einfaches Problem funktionieren würde.

Verwandte Themen