[CollectionViewSource不会在调用刷新时触发过滤器事件

问题描述 投票:0回答:1

想法是,我有一个文本框,在其中键入一个字符串,该字符串将过滤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上的filter事件。我检查了过滤事件仅在加载用户控件时才触发。

到目前为止已尝试:

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

如果您可以为上述问题推荐任何基于mvvm的解决方案,将很有帮助。

wpf mvvm collectionviewsource
1个回答
0
投票

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

如果生成的LiveFilteringProperties实现了CollectionView接口,则添加ICollectionViewLiveShaping也应该起作用。

© www.soinside.com 2019 - 2024. All rights reserved.