使用数据虚拟化,与在View的ItemsControl中的SelectedItem在视图模型结合的性质问题 [英] Using Data Virtualization, the problem of binding a property in ViewModel with SelectedItem of ItemsControl in View

查看:252
本文介绍了使用数据虚拟化,与在View的ItemsControl中的SelectedItem在视图模型结合的性质问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

关于数据Virtualizatoin在WPF中, WPF:数据虚拟化是一篇好文章。

通过使用此,数据虚拟化一样好我的code执行,但有一个问题,这是我不能在一个视图模型属性绑定在视图的ItemsControl中的SelectedItem。如果一个数据项满足,而数据加载某些情况下,一个项目将被设置为在视图模型的属性,然后它会在视图的ItemsControl中的SelectedItem的约束,但不会。

我对这code如下。关于类型IItemsProvider andVirtualizingCollection,请参阅 WPF:数据虚拟化

到目前为止,我曾尝试:


  1. 我敢肯定,如果不使用数据虚拟化,所选的项目绑定会很酷。

  2. 在VirtualizingCollection的的IndexOf(T项目)方法总是返回-1。由于认为这将是问题,我实现了的IndexOf(T项目)返回一个实际指标,但它并不关心这个问题。

实施IItemsProvider的code

 公共类WordViewModelProvider:IItemsProvider< WordViewModel>
{
    私人字符串_searchText =一些文本;    公共WordViewModel的SelectedItem
    {
        得到;
        私人集;
    }    #地区IItemsProvider< WordViewModel>会员
    公众诠释FetchCount()
    {
        锁定(_words)
        {
            在_words诠释计数=(从字
                         其中,word.Name.Contains(_searchText)
                         选字).Count之间的();
            返回计数;
        }
    }    公众的IList< WordViewModel> FetchRange(INT的startIndex,诠释计数)
    {
        锁定(_words)
        {
            //请考虑_word为IEnumerable< Word和GT;
            IQueryable的< Word和GT;查询=(从_words字
                                      其中,word.Name.Contains(_searchText)
                                      选择的字);            清单< WordViewModel> 。结果= query.ToList()ConvertAll(W =>
            {
                VAR wordViewModel =新WordViewModel(W,_searchText);
                如果(w.Name.Equals(_searchText,StringComparison.InvariantCultureIgnoreCase))
                {
                    的SelectedItem = wordViewModel;
                }
                返回wordViewModel;
            });
            返回结果;
        }
    }
    #endregion
}

在视图模型使用VirtualizingCollection的code

 公共无效Viewlist产品()
{
    VAR wordViewModelProvider =新WordViewModelProvider();
    VAR virtualizingCollection =新VirtualizingCollection< WordViewModel>(wordViewModelProvider);
    //的IList< WordViewModel>键入与景观的结合的ItemsSource。
    WordViewModels = virtualizingCollection;
    // WordViewModel类型与景观的结合的SelectedItem
    的SelectedItem = wordViewModelProvider.SelectedItem;
}


解决方案

我想张贴关于很好的参考虚拟化,以处理大数据集WPF

有关虚拟化方法:

About Data Virtualizatoin in WPF, the WPF: Data Virtualization is a good article.

With using this, Data Virtualization was executed as good in my code but there is the one problem, which is that I cannot bind a property in ViewModel with SelectedItem of ItemsControl in View. If one item of data satisfies some condition while data loads, the one item will be set as a property in ViewModel and then it will be bound with SelectedItem of ItemsControl in View, but will not.

My code about this is the following. About the types of IItemsProvider andVirtualizingCollection, please refer to the WPF: Data Virtualization.

So far, I have tried:

  1. I'm sure that if Data Virtualization were not used, the Selected Item Binding would be cool.
  2. The IndexOf(T item) method in VirtualizingCollection returns always -1. As thinking this would be the problem, I implemented that the IndexOf(T item) returns a actual index, but it was not concerned with this problem.

The code of implementing 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
}

The code of using VirtualizingCollection in 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;
}

解决方案

I would like to post good references about Virtualization to deal with large data set in WPF.

For Virtualization approaches:

这篇关于使用数据虚拟化,与在View的ItemsControl中的SelectedItem在视图模型结合的性质问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆