[英]Filtering an ObservableCollection with CollectionViewSource yields
[英]Filtering an ObservableCollection?
當我將ListBox直接綁定到ObservableCollection時,我得到了我的ListBox中顯示的實時更新,但是只要我在混合中添加其他LINQ方法,我的ListBox就不會再通知ObservableCollection的任何更改。
在這里,讓我舉一個例子來說明;
public partial class MainPage : PhoneApplicationPage
{
ObservableCollection<String> Words = new ObservableCollection<string>();
public MainPage()
{
InitializeComponent();
listBox1.ItemsSource = Words;
}
private void AddButton_Click(object sender, RoutedEventArgs e)
{
Words.Add(DateTime.Now.ToString());
}
}
在這里,我向一個簡單的頁面添加了一個Button和一個ListBox,然后單擊該按鈕使新項目立即出現在ListBox中。
但是,如果我改變了
listBox1.ItemsSource = Words;
至
listBox1.ItemsSource = Words.Where(w => w.Contains(":"));
ListBox不再更新。
如何在我的ObservableCollection和ListBox之間添加“過濾器”,並且仍然可以在不必再次設置.ItemsSource的情況下進行更新?
嘗試使用CollectionViewSource,如下所示:
WordsView = new CollectionViewSource();
WordsView.Filter += Words_Filter;
WordsView.Source = Words;
// ...
void Words_Filter(object sender, FilterEventArgs e)
{
if (e.Item != null)
e.Accepted = ((string)e.Item).Contains(":");
}
為什么它不起作用:
listBox1.ItemsSource = Words.Where(w => w.Contains(":"));
你沒有綁定ObservableCollection,而是綁定了Linq生成的IEnumerable。 這個新的“列表”不會通知ListBox有關列表中的更改。
您應該使用ICollectionView.Filter
屬性:
ICollectionView view = CollectionViewSource.GetDefaultView(Words);
view.Filter = WordFilter;
...
bool WordFilter(object o)
{
string w = (string)o;
return w.Contains(":")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.