【问题标题】:Stop collection view filtering停止集合视图过滤
【发布时间】:2014-04-16 08:18:26
【问题描述】:

我有两个列表框,都将项目源设置为 MyList。在 listbox1 中,我想根据一些谓词过滤条目。我通过以下代码实现

ICollectionView listview= CollectionViewSource.GetDefaultView(MyList);

listview.filter(predicate)

我的问题是我不希望将此过滤应用于 listbox2,但保留一个 itemsource 对我来说很重要。我怎样才能做到这一点。

  <ListBox Name="listbox1" ItemsSource="{Binding MyList}"/>
    <ListBox Name="listbox2" ItemsSource="{Binding MyList}"/>

我尝试将 VirtualizingStackpanel.IsVirtualizing 设置为 false ,但它不起作用。

【问题讨论】:

  • keep one itemsource 是什么意思?你想通过这种方式达到什么目的?
  • @HamletHakobyan 我有几个视图,它们显示相同的信息,但图形表示不同。因此这些视图的数据相同,但数据模板不同。我不想创建重复列表在我的视图模型和逻辑中让它们保持同步,这就是我想要保持相同 itemsource 的原因。
  • 如果你想添加另一个过滤器,也许可以使用 Refresh()。
  • @michael 我想你误会了我,我不想过滤一个视图影响另一个视图。

标签: c# wpf mvvm listbox observablecollection


【解决方案1】:

除了将源集合绑定到列表框外,您还可以在需要过滤的地方创建集合视图源并将其视图绑定到列表框。

public CollectionViewSource ViewSource1 { get; set; }


ViewSource1 = new CollectionViewSource { Source = MyList};
ViewSource1.View.Filter(predicate1)

然后将视图源的View绑定到第一个列表框。您可以将源集合绑定到第二个列表框。

 <ListBox Name="listbox1" ItemsSource="{Binding ViewSource1.View}"/>
 <ListBox Name="listbox2" ItemsSource="{Binding MyList}"/>

【讨论】:

  • 我正在寻找一种方法,如果它可以使用相同的数据源来完成。我还有其他列表框也使用它,我只需要在一个列表框中应用过滤。所以只是因为一个列表框我不想为所有人创建不同的视图源。
  • 在这种情况下,您可以只创建一个需要过滤的视图源。对于所有其他列表框,您可以绑定源集合本身。
  • 我会将您的答案标记为已接受。请更改以下内容
猜你喜欢
  • 2023-03-24
  • 2018-09-05
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多