【问题标题】:CollectionViewSource is not triggering the filter event when refresh is called调用刷新时,CollectionViewSource 未触发过滤器事件
【发布时间】:2020-06-23 11:50:16
【问题描述】:

我的想法是,我有一个文本框,我在其中输入一个字符串,这个字符串将过滤作为树视图的 collectionviewsource。附上以下代码:

排序和分组工作正常。

View.xaml

<TreeView x:Name="SystemsTreeView" ItemsSource="{Binding Source={StaticResource SystemCollection}, Path=Groups}">

     <CollectionViewSource x:Key="SystemCollection" Source="{Binding SystemsList}" Filter="SystemCollectionChangeFilter" IsLiveFilteringRequested="True" >   
        <CollectionViewSource.LiveFilteringProperties>
                        <clr:String>SystemName</clr:String>
                        <clr:String>Version</clr:String>
                    </CollectionViewSource.LiveFilteringProperties>
        <!--Sorting of Systems--> 
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="SystemName"/>
            <scm:SortDescription PropertyName="Version" Direction="Descending"/>
        </CollectionViewSource.SortDescriptions>
         <!--Grouping of Systems--> 
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="SystemName" />
        </CollectionViewSource.GroupDescriptions>                
    </CollectionViewSource>

SystemCollectionChangeFilter 调用 viewmodel 上的方法进行过滤。

视图模型

ICollectionView viewSource = CollectionViewSource.GetDefaultView(SystemsList); //in the constructor


private string _systemNameFilter;

public string SystemNameFilter //Attached to Textbox (for filtering)
{
   get { return _systemNameFilter; }
   set
   {
      if (_systemNameFilter != value)
         {
            _systemNameFilter = value;
             viewSource.Refresh();  //This is not triggering the filtering event.  
             NotifyPropertyChanged();
         }
    }
}

viewSource.Refresh() 未触发 collectionviewsource 上的过滤器事件。我检查了过滤事件仅在加载用户控件时触发。

到目前为止尝试过:

  1. 我也尝试过将 LiveFilteringRequested 属性设置为 true 在 xaml 中,还尝试添加 CollectionViewType,但没有一个 工作中。
  2. Trigger Filter on CollectionViewSource, 这个解决方案要求我将这些东西保留在 viewmodel 中,而不是 在 xaml 中,这对我来说是个问题。

如果您能针对上述问题推荐任何基于 mvvm 的解决方案,将会很有帮助。

【问题讨论】:

  • 在视图中的CollectionViewSource 上调用Refresh 或将您的属性添加到相同的LiveFilteringProperties 集合中。
  • 添加了 LiveFilteringProperties 但没有变化。你能告诉我如何在 mvvm 的视图中调用刷新吗?
  • 在视图模型中定义一个ICollectionView 或任何其他类型的源集合并对其进行操作。在视图中定义排序和过滤然后尝试从视图模型中刷新它是没有意义的。这不是 MVVM。将视图模型中的逻辑保留在视图中。
  • 在 viewmodel 中将我的集合更改为 ICollection 并在 viewmodel 中进行排序、分组和过滤将是我最后的手段,然后我会更改我的问题,但是因为我不想更改现在很大,有没有一种方法可以让我只看到我的过滤逻辑?你能提供这个吗,我会把它标记为答案。我在任何地方都没有找到过滤逻辑。谢谢
  • 您是否尝试在名为“SystemCollection”的CollectionViewSource 上调用Refresh

标签: wpf mvvm collectionviewsource


【解决方案1】:

在视图中名为“SystemCollection”的CollectionViewSource 上调用Refresh(),或在视图模型中实现ICollectionView 或任何其他类型的源集合并从那里刷新它。

如果生成的CollectionView 实现了ICollectionViewLiveShaping 接口,添加LiveFilteringProperties 也应该可以工作。

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多