2011-07-06 49 views
2

關於WPF中的Data Virtualizatoin,WPF: Data Virtualization是一篇很好的文章。使用數據虛擬化,將ViewModel中的一個屬性與ViewControl中的ItemsControl的SelectedItem綁定的問題

使用這個,Data Virtualization在我的代碼中執行得很好,但存在一個問題,那就是我無法將ViewModel中的屬性與View的ItemsControl的SelectedItem綁定在一​​起。如果一個數據項在數據加載時滿足一些條件,則將一個項目設置爲ViewModel中的一個屬性,然後它將與View的ItemsControl的SelectedItem綁定,但不會。

我的代碼如下。關於IItemsProvider和VirtualizationCollection的類型,請參考WPF: Data Virtualization

到目前爲止,我曾嘗試:

  1. 我敢肯定,如果不使用數據虛擬化,選擇的項目綁定會很酷。
  2. VirtualizationCollection中的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 
} 

在視圖模型使用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; 
} 
+0

有一個很好的文章涉及這個問題,這是[我如何能在現有的WPF數據虛擬化解決方案改善?](http://bea.stollnitz.com/blog/?p=378) –

回答

3

我想發佈關於虛擬化處理好參考在WPF中設置大量數據。

對於虛擬化方法:

+0

所有到Bea Stollnitz的鏈接已經死亡(2016年6月)。你有其他地方的信息和源代碼嗎?請分享,如果你這樣做,謝謝。 – Hannish

+1

@Hannish幸運的是,我已經實現了這一點,並有我在家裏在我的電腦上寫的代碼。我再次需要這個解決方案。微軟應該只是將一個VirtualizedCollection添加到WPF庫。 –

+0

@LeeO。你可以把它上傳到DropBox或類似的東西,併發佈一個鏈接供其他人下載?謝謝! – Hannish

相關問題