将 CollectionViewSource 中的属性绑定到 ViewModel 的属性

本文关键字:属性 ViewModel 绑定 CollectionViewSource | 更新日期: 2023-09-27 18:32:12

我在这里遇到了一个新问题。

我有一个数据网格和一个文本框。我想根据文本框的值过滤数据网格。

我已经使用此处提到的MarkupExtensions做到了这一点。

现在它可以正常工作,直到 Value 属性(上面链接中提到的 PropertyFilter 类的属性)是 XAML 中提到的字符串。当我将其更改为绑定时,它停止工作。这是我的绑定 XAML:

<CollectionViewSource x:Key="GroupsViewSource" Source="{Binding Groups}">
    <CollectionViewSource.Filter>
        <me:Filter>
            <me:PropertyFilter PropertyName="GroupName"
                               Value="{Binding SearchGroupName}" />
        </me:Filter>
    </CollectionViewSource.Filter>
</CollectionViewSource>

搜索组名称是我的视图模型中字符串类型的简单属性。

我还尝试更改绑定,如下所示:

Value = "{Binding DataContext.SearchGroupName, RelativeSource={RelativeSource 
                               Mode=FindAncestor, AncestorType={x:Type UserControl}}}"

我尝试使用系统诊断调试它,如下所示:

<CollectionViewSource x:Key="GroupsViewSource" Source="{Binding Groups}">
    <CollectionViewSource.Filter>
        <me:Filter>
            <me:PropertyFilter PropertyName="GroupName"
                               Value="{Binding SearchGroupName, diag:PresentationTraceSources.TraceLevel=High}" />
        </me:Filter>
    </CollectionViewSource.Filter>
</CollectionViewSource>

但随后我得到一个编译错误:未知属性 PresentationTraceSources.TraceLevel for System.Windows.Data.Binding......

我认为我与RelativeSource的绑定不起作用,因为我认为CollectionViewSource不是可视化/逻辑树的成员。

因此,我认为我的数据上下文可能是空的。如果处于同样的情况,你们更喜欢什么解决方案?????

将 CollectionViewSource 中的属性绑定到 ViewModel 的属性

您可以

尝试使用类似 Path=DataContext.<property-name>, Source={x:Reference <element-name>} 的绑定将过滤器移动到具有正确DataContext的框架元素的资源中。在需要的地方使用 StaticResource 引用过滤器。

例如,此解决方法对于在集合容器中进行绑定非常有用。


代码应该是这样的(未经测试):

<SomeElement Name="el">
    <SomeElement.Resources>
        <me:PropertyFilter x:Key="Filter1" PropertyName="GroupName"
                           Value="{Binding DataContext.SearchGroupName, Source={x:Reference el}}" />
        <CollectionViewSource x:Key="GroupsViewSource" Source="{Binding Groups}">
            <CollectionViewSource.Filter>
                <me:Filter>
                    <StaticResource ResourceKey="Filter1"/>
                </me:Filter>
            </CollectionViewSource.Filter>
        </CollectionViewSource>