Utilizando la virtualización de datos, el problema de vincular una propiedad en ViewModel con SelectedItem of ItemsControl en View

Acerca de Data Virtualizatoin en WPF, elWPF: virtualización de datos es un buen artículo.

Con esto, la virtualización de datos se ejecutó como buena en mi código, pero existe el único problema, que es que no puedo vincular una propiedad en ViewModel con SelectedItem de ItemsControl en View. Si un elemento de datos cumple alguna condición mientras se cargan los datos, el elemento se establecerá como una propiedad en ViewModel y luego se vinculará con SelectedItem of ItemsControl en View, pero no lo hará.

Mi código sobre esto es el siguiente. Sobre los tipos de IItemsProvider y VirtualizationCollection, consulte laWPF: virtualización de datos.

Hasta ahora, he intentado:

Estoy seguro de que si no se usara la virtualización de datos, el enlace del elemento seleccionado sería genial.El método IndexOf (elemento T) en VirtualizingCollection devuelve siempre -1. Como pensaba que este sería el problema, implementé que el IndexOf (elemento T) devuelve un índice real, pero no estaba preocupado por este problema.

El código de implementación de IItemsProvider

public class WordViewModelProvider : IItemsProvider<WordViewModel>
{
    private string _searchText = "some text";

    public WordViewModel SelectedItem
    {
        get;
        private set;
    }

    #region IItemsProvider<WordViewModel> Members
    public int FetchCount()
    {
        lock (_words)
        {
            int count = (from word in _words
                         where word.Name.Contains(_searchText)
                         select word).Count();
            return count;
        }
    }

    public IList<WordViewModel> FetchRange(int startIndex, int count)
    {
        lock (_words)
        {
            //Please, regard _word as IEnumerable<Word>
            IQueryable<Word> query = (from word in _words
                                      where word.Name.Contains(_searchText)
                                      select word);

            List<WordViewModel> result = query.ToList().ConvertAll(w =>
            {
                var wordViewModel = new WordViewModel(w, _searchText);
                if (w.Name.Equals(_searchText, StringComparison.InvariantCultureIgnoreCase))
                {
                    SelectedItem = wordViewModel;
                }
                return wordViewModel;
            });
            return result;
        }
    }
    #endregion
}

El código de uso de VirtualizingCollection en ViewModel

public void ViewList()
{
    var wordViewModelProvider = new WordViewModelProvider();
    var virtualizingCollection = new VirtualizingCollection<WordViewModel>(wordViewModelProvider);
    //IList<WordViewModel> type to bind with View's ItemsSource.
    WordViewModels = virtualizingCollection;
    //WordViewModel type to bind with View's SelectedItem
    SelectedItem = wordViewModelProvider.SelectedItem;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta