2013-03-21 12 views
5

So che questa domanda è stata posta prima, ma non riuscivo a trovare quello che cercavo.Come annullare la selezione di Datagrid evento modificato in 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; 
       } 
} 

Anche se chiamo e.Handled = true; sarà selezionare la riga DataGrid. Non voglio chiamare dataGrid1.SelectedIndex =-1; perché attiverà di nuovo l'evento selectionchanged. Ho anche provato dataGrid1.UnSelectAll(); Qualsiasi altro modo per annullare l'evento selectionchanged?

risposta

0

Hai pensato a un'implementazione alternativa? Sto pensando su Binding e un metodo di verifica prima di cambiare il SelectedItem. Un esempio:

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

e sottostante VM potrebbe essere il seguente:

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

Sei sicuro che funzionerà? Penso che la selezione verrà modificata ma SelectedEntry no – Demarsch

1

ho usato una varietà di metodi per tentare di annullare la selezione cambiato evento, compreso il metodo della risposta selezionata, ma nessuno di loro ha funzionato. Questo, tuttavia, ha lavorato molto per me:

Utilizzando il gestore di eventi PreviewMouseDown per il 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); 
      } 
     } 
    } 
} 

Ciò mantiene con successo la riga corrente selezionata se l'utente fa clic su "No", e se si clicca " Sì ", quindi l'esecuzione continuerà normalmente. Speriamo che questo aiuti qualcuno in futuro, perché ci è voluto molto tempo per trovare qualcosa che potesse funzionare per un problema apparentemente semplice.

Problemi correlati