将 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不是可视化/逻辑树的成员。
因此,我认为我的数据上下文可能是空的。如果处于同样的情况,你们更喜欢什么解决方案?????
您可以
尝试使用类似 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>