WPF DataGrid Отмена Изменить выбор - PullRequest
2 голосов
/ 27 июля 2011

Я работаю с 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);
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 26 августа 2011

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

    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) вместо использования копии выбранного элемента.Это выглядит очевидным, но мне потребовались дни, чтобы понять это!Спасибо всем, кто помог :)

1 голос
/ 27 июля 2011

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

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

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

...