Как отменить событие изменения выбора Datagrid в 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;
                }
}

даже если я называю e.Handled = true; он выберет строку datagrid. Я не хочу звонить dataGrid1.SelectedIndex =-1; потому что он снова вызовет событие selectionchanged. Я также пытался dataGrid1.UnSelectAll(); Любой другой способ отменить событие selectionchanged?

2 ответов


вы думали об альтернативной реализации? Я думаю о Binding и метод проверки перед изменением SelectedItem. Пример:

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

и базовая виртуальная машина может выглядеть так:

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

я использовал различные методы, чтобы попытаться отменить событие изменения выбора, включая метод из выбранного ответа, но ни один из них не работал. Это, однако, отлично сработало для меня:

использование обработчика событий PreviewMouseDown для 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);
           }
        }
    }
}

это успешно сохраняет выбранную текущую строку, если пользователь нажимает "нет", и если они нажимают" да", то выполнение будет продолжаться как обычно. Надеюсь, это поможет кому-то в будущем, потому что это заняло долгое время, чтобы найти что-то, что будет работать для казалось бы простой проблемы.