c# - 使用Data Virtualization,ViewModel中的属性与View中ItemsControl的SelectedItem绑定(bind)的问题

标签 c# wpf binding virtualization data-virtualization

关于 WPF 中的数据虚拟化,WPF: Data Virtualization是一篇好文章。

通过使用它,Data Virtualization 在我的代码中执行得很好,但存在一个问题,即我无法将 ViewModel 中的属性与 View 中 ItemsControl 的 SelectedItem 绑定(bind)。如果在加载数据时某一项数据满足某种条件,则该项将被设置为ViewModel中的一个属性,然后它将与View中ItemsControl的SelectedItem绑定(bind),但不会。

我的代码如下。关于IItemsProvider和VirtualizingCollection的类型,请引用WPF: Data Virtualization .

到目前为止,我已经尝试过:

  1. 我敢肯定,如果不使用数据虚拟化,Selected Item Binding 会很酷。
  2. VirtualizingCollection 中的 IndexOf(T item) 方法总是返回 -1。考虑到这会是问题所在,我实现了 IndexOf(T item) 返回一个实际索引,但它并不关心这个问题。

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
}

在ViewModel中使用VirtualizingCollection的代码

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;
}

最佳答案

我想发布有关虚拟化的很好的引用资料,以处理 WPF 中的大型数据集。

对于虚拟化方法:

关于c# - 使用Data Virtualization,ViewModel中的属性与View中ItemsControl的SelectedItem绑定(bind)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592472/

相关文章:

c# - 将标题绑定(bind)到选定的组合框文本

WPf : Binding with more than one property at a time

c# - 谁应该负责选择合适的派生类?

c# - NavigationView SetCheckedItem 不触发 OnNavigationItemSelected

wpf - 可以用 XAML 编写这样的动态字符串控件吗?

Wpf 将 View 绑定(bind)到 ViewModel 添加到 wpf 窗口

swift - 在 Swift 中添加 ValueTransformer

c# - 为什么'Weiss'='Weiß'或通过Unicode列在SQL Server中搜索

c# - 获取字节子数组

wpf - 绑定(bind)到 Storyboard 上的附加行为