【问题标题】:Binding multiple ComboBoxes to the same collection but filtering just one将多个组合框绑定到同一个集合但只过滤一个
【发布时间】:2014-03-11 17:17:15
【问题描述】:

我有一个自定义控件 SearchableComboBox,它继承自 ComboBox。它只是在项目控件上方有一个文本框,用于过滤可见项目,目前通过设置 Items.Filter。

我的表单上有多个 SearchableComboBoxes 都绑定到同一个集合。我希望它们可以独立搜索,但是按照我现在连接的方式,如果我过滤一个,那么它们都会被过滤(如果一个已经有一个与过滤器不匹配的选择,它的选择会被清除)。

我还尝试将 UnfilteredItems 属性添加到 SearchableComboBox,绑定到该属性,然后使用从 UnfilteredItems 创建的 CollectionView 作为 ItemsSource,然后通过 CollectionView 进行过滤。这提供了完全相同的功能,所有 SearchableComboBox 都被一起过滤。

非常感谢任何帮助,在此先感谢。

【问题讨论】:

  • 显示您的过滤方式。展示你的绑定方式。

标签: c# wpf combobox


【解决方案1】:

您必须使用与您的ItemsSource 关联的CollectionViewSource.GetDefaultView(),这将始终返回与您的源集合相关的ICollectionView 的相同实例。

改为创建新的CollectionViewSource 并使用其View 属性进行绑定,这对于您的绑定来说是唯一的。

类似这样的:

private ICollectionView customView;
public ICollectionView CustomView
{
   get
   {
      if (customView== null)
      {
         customView= new CollectionViewSource()
                     { Source = SourceCollection }.View;
         customView.Filter = p => !(p as CustomClass).BoolProperty;
      }
      return customView;
   }
 }

【讨论】:

  • 非常感谢您的快速回复,我在发布后就知道了!一旦允许,我会将您的答案标记为正确答案。
  • 是的,在阅读您的问题后,这是我首先想到的.. :)
【解决方案2】:

啊,当然,在发布了我一个多小时以来一直在思考的问题 2 分钟后,我自己就想通了。

我通过在源集合上调用 CollectionViewSource.GetDefaultView 来创建 CollectionView,这似乎为所有 SearchableComboBoxes 返回相同的引用。如果我改为实例化一个新的 CollectionViewSource,将其 Source 属性设置为源集合,然后将我的 ItemsSource 设置为 CollectionViewSource.View 属性,现在可以按我的意愿工作,并且每个 SearchableComboBox 都独立于其他过滤器。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2019-08-15
    • 2016-08-23
    • 2010-09-21
    • 2015-10-19
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多