Как отменить событие изменения выбора 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);
}
}
}
}
это успешно сохраняет выбранную текущую строку, если пользователь нажимает "нет", и если они нажимают" да", то выполнение будет продолжаться как обычно. Надеюсь, это поможет кому-то в будущем, потому что это заняло долгое время, чтобы найти что-то, что будет работать для казалось бы простой проблемы.