【问题标题】:CollectionViewSource filtering only in xamlCollectionViewSource 仅在 xaml 中过滤
【发布时间】:2020-06-24 15:06:26
【问题描述】:

我的文本框将过滤后的字符串提供给集合,当我在文本框中输入新值时,我希望根据新的过滤器值刷新我的集合。 我不想将过滤逻辑放在我的视图模型或代码中,而只放在 XAML 中。 代码附在下面。排序和分组工作正常。我已经检查了这个答案:https://stackoverflow.com/a/6462282/5130106,它几乎可以做到这一点,但在刷新集合时缺乏,因此,我正在创建一个新问题,因为我找不到答案。

有什么方法可以实现吗?

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

     <CollectionViewSource x:Key="SystemCollection" Source="{Binding SystemsList}" Filter="{MyLogic}">   
        <!--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>

【问题讨论】:

  • SystemsList 是什么类型的?你为什么使用Source={StaticResource SystemCollection}
  • SystemsList 是一个 observableCollection,我正在使用 staticResource 来使用 collectionviewsource 进行排序、分组和希望过滤,如果它有效的话:)

标签: wpf mvvm collectionviewsource


【解决方案1】:

我不想将过滤逻辑放在我的视图模型或代码中,而只放在 XAML 中

不可能。您不能在纯 XAML 中执行此操作。 XAML 是一种标记 语言。你应该用编程语言来实现你的逻辑。

根据您当前的设置,只要TextBox 发生更改,您就应该在CollectionViewSource 上调用Refresh(),例如在代码隐藏中的TextChanged 事件处理程序中。

如果你想从视图模型中刷新过滤器,你也应该在那里执行实际的过滤。例如,您可以公开视图绑定到的ICollectionView。在视图中定义过滤逻辑并尝试从视图模型中刷新它是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多