【问题标题】:Filtering an ObservableCollection?过滤 ObservableCollection?
【发布时间】:2011-04-25 19:55:05
【问题描述】:

当我将 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());
    }
}

这里我在一个简单的页面中添加了一个按钮和一个列表框,单击按钮使新项目立即出现在列表框中。

但是,如果我从

        listBox1.ItemsSource = Words;

        listBox1.ItemsSource = Words.Where(w => w.Contains(":"));

ListBox 不再更新。

如何在我的 ObservableCollection 和 ListBox 之间添加一个“过滤器”,并且仍然可以更新它而无需再次设置 .ItemsSource?

【问题讨论】:

    标签: c# linq xaml windows-phone-7 observablecollection


    【解决方案1】:

    尝试像这样使用 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(":");
    }
    

    【讨论】:

    • ListBox和CollectionViewSource的绑定怎么样?我不能像以前一样使用 .ItemsSource 。我必须使用 .DataContext 吗?
    • 当然可以,只需将 ItemsSource 设置为 WordsView.View 属性
    • @bendewey 这个解决方案没问题。但是还是很慢
    【解决方案2】:

    为什么它不起作用:

    listBox1.ItemsSource = Words.Where(w => w.Contains(":"));
    

    您没有绑定 ObservableCollection,而是绑定了 Linq 生成的 IEnumerable。这个新的“列表”不会通知 ListBox 列表的变化。

    【讨论】:

      【解决方案3】:

      您应该使用ICollectionView.Filter 属性:

      ICollectionView view = CollectionViewSource.GetDefaultView(Words);
      view.Filter = WordFilter;
      
      ...
      
      
      bool WordFilter(object o)
      {
          string w = (string)o;
          return w.Contains(":")
      }
      

      【讨论】:

      • 它是否也适用于 Windows Phone 7?我在静态 CollectionViewSource 类上找不到 GetDefaultView 方法。
      • @Frode,显然不是...这在 WPF 中有效;我检查了 Silverlight 中是否存在 CollectionViewSource,但我没有想到检查 GetDefaultView... 另一种选择是在 XAML 中显式创建 CollectionViewSource,将其绑定到您的集合,并处理 Filter 事件
      猜你喜欢
      • 2015-07-12
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2015-03-29
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多