Выберите другую строку DataGrid, только если условие выполнено - WPF - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть DataGrid в WPF.

У меня есть ситуация, в которой, если выбрана одна строка, а затем пользователь выбирает другую, тогда должно появиться сообщение типа -

Вы уверены, что хотите выбрать это?

И если пользователь говорит «да», то должна быть выбрана только другая строка.

Но, в текущем случае, событие SelectionChanged уже вызвано и новая строка выбрана.

Я пытался использовать привязку свойств

<Style TargetType="DataGridRow">
     <Setter Property="IsEnabled" Value="{Binding IsToEnableRowSelection, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>                        
</Style>

В конце -

private void MyDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (MessageBox.Show("Are you sure you want save changes?", "Confirm", MessageBoxButtons.YesNo))
    {
        e.Handled = false;
        IsToEnableRowSelection = true;
    }
    else
    {
        e.Handled = true;
        IsToEnableRowSelection = false;
    }
}

Объявление свойства с событием INotify -

public bool IsToEnableRowSelection
{
    get
    {
        return enableSelectedRow;
    }
    set
    {
        enableSelectedRow = value;
        OnPropertyChanged("IsToEnableRowSelection");
    }
}

protected void OnPropertyChanged([CallerMemberName()] string name = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

Но я не могу получить желаемое поведение.

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Вы можете обработать событие PreviewMouseLeftButtonDown для DataGridRow примерно так:

private void DataGridRow_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (dg.SelectedItem != null)
    {
        e.Handled = true;

        HitTestResult hitTestResult = VisualTreeHelper.HitTest(dg, e.GetPosition(dg));
        DataGridCell cell = FindParent<DataGridCell>(hitTestResult.VisualHit);

        if (MessageBox.Show(this, "confirm....?", "caption..:", MessageBoxButton.YesNoCancel) == MessageBoxResult.Yes)
        {
            dg.SelectedItem = cell.DataContext;
            cell.Focus();
        }
    }
}

XAML:

<Style TargetType="DataGridRow">
    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridRow_PreviewMouseLeftButtonDown" />
</Style>
0 голосов
/ 27 февраля 2020

Вы можете попробовать это, я надеюсь, это поможет вам.

 Object _SelectedItem; //_SelectedItem is used to avoid the repeated loops
    DataGridCell _FocusedCell; //_FocusedCell is used to restore focus
    private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        if (_SelectedItem == MyDataGrid.SelectedItem)
        {
            return;
        }
        _SelectedItem = MyDataGrid.SelectedItem;


        if (e.RemovedItems.Count > 0 && e.RemovedItems[0] != null && MessageBox.Show("Are you sure you want save changes?", "Confirm", MessageBoxButton.YesNo) != MessageBoxResult.Yes)
        {

            _SelectedItem = e.RemovedItems[0];
            Dispatcher.BeginInvoke(
              new Action(() =>
              {
                  MyDataGrid.SelectedItem = e.RemovedItems[0];
                  if (_FocusedCell != null)
                  {
                      _FocusedCell.Focus();
                  }
              }), System.Windows.Threading.DispatcherPriority.Send); //hope a high priority can avoid flicking.
        }
    }

    private void DataGridCell_LostFocus(object sender, RoutedEventArgs e)
    {
        _FocusedCell = sender as DataGridCell;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...