簡體   English   中英

過濾ObservableCollection?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM