WPF DataGrid Отменить изменение выбора

Я работаю с WPF DataGrid в стиле MVVM и не могу отменить изменение выбора из ViewModel.

Есть ли проверенный способ сделать это? Мой последний опробованный код приведен ниже. Теперь я даже не против инвестировать в хак внутри кода позади.

public SearchResult SelectedSearchResult
{
    get { return _selectedSearchResult; }
    set
    {
        if (value != _selectedSearchResult)
        {
            var originalValue = _selectedSearchResult != null ? _selectedSearchResult.Copy() : null;
            _selectedSearchResult = value;
            if (!DispatchSelectionChange(value)) // Returns false if the selection has to be cancelled.
            {
                _selectedSearchResult = originalValue;
                // Invokes the property change asynchronously to revert the selection.
                Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() => NotifyOfPropertyChange(() => SelectedSearchResult)));
                return;
            }
            NotifyOfPropertyChange(() => SelectedSearchResult);
        }
    }
}

person Ε Г И І И О    schedule 27.07.2011    source источник


Ответы (2)


После нескольких дней проб и ошибок наконец-то все заработало. Ниже приведен код:

    public ActorSearchResultDto SelectedSearchResult
    {
        get { return _selectedSearchResult; }
        set
        {
            if (value != _selectedSearchResult)
            {
                var originalSelectionId = _selectedSearchResult != null ? _selectedSearchResult.Id : 0;
                _selectedSearchResult = value;
                if (!DispatchSelectionChange(value)) // Returns false if the selection has to be cancelled.
                {
                    // Invokes the property change asynchronously to revert the selection.
                    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() => RevertSelection(originalSelectionId)));
                    return;
                }
                NotifyOfPropertyChange(() => SelectedSearchResult);
            }
        }
    }

    private void RevertSelection(int originalSelectionId)
    {
        _selectedSearchResult = SearchResults.FirstOrDefault(s => s.Id == originalSelectionId);
        NotifyOfPropertyChange(() => SelectedSearchResult);
    }

Ключевым моментом здесь является использование совершенно нового первоначально выбранного элемента из коллекции сетки с привязкой к данным (т. е. SearchResults), а не использование копии выбранного элемента. Это выглядит очевидным, но мне потребовались дни, чтобы понять это! Спасибо всем, кто помог :)

person Ε Г И І И О    schedule 26.08.2011

если вы хотите предотвратить изменение выбора, вы можете попробовать это.

если вы хотите отменить выбор, вы можете просто использовать методы ICollectionView.MoveCurrentTo() (по крайней мере, вы должны знать, какой элемент вы хотите выбрать;)).

мне не совсем понятно, чего вы на самом деле хотите.

person blindmeis    schedule 27.07.2011
comment
привет блинкмерис, извините за поздний ответ. то, что я пытаюсь сделать, это показать пользователю подтверждающее сообщение для сохранения изменений (внутри DispatchSelectionChange), когда он выбирает другой результат, и если пользователь решил отменить его, мне нужно вернуть выбор к исходному. - person Ε Г И І И О; 23.08.2011
comment
Я попробовал оба метода, которые вы указали. Кажется, ни один из них не работает для меня :( нажатие на клавиатуру и мышь не подходит в моем случае. И ICollectionView ведет себя не так, как должно быть. Дело в том, что даже несмотря на то, что CurrentItem синхронизирован, сетка визуально показывает другой элемент как выбрано.Мне кажется ошибка в WPF... - person Ε Г И І И О; 25.08.2011