当我直接绑定一个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(":"));
列表框不再更新。
我如何在我的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。这个新的"list"不会通知ListBox列表的变化
您应该使用ICollectionView.Filter
属性:
ICollectionView view = CollectionViewSource.GetDefaultView(Words);
view.Filter = WordFilter;
...
bool WordFilter(object o)
{
string w = (string)o;
return w.Contains(":")
}