我在这里遇到了一个新问题。
我有一个DataGrid和一个TextBox。我想根据TextBox的值来过滤DataGrid。
我使用MarkupExtensions
提到here。
现在它可以正常工作到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>
SearchGroupName是我的ViewModel中类型字符串的简单属性。
我还尝试按如下方式更改绑定:
Value = "{Binding DataContext.SearchGroupName, RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
我尝试使用System.Diagnostics进行调试,如下所示:
<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>
但后来我收到一个编译错误:System.Windows.Data.Binding的未知属性PresentationTraceSources.TraceLevel ......
我认为我与RelativeSource的绑定不起作用,因为我认为CollectionViewSource不是Visual / Logical Tree的成员。
因此我认为我的DataContext可能为null。如果你处于相同的情况,你们更喜欢哪些解决方案?????
答案 0 :(得分:1)
您可以使用类似DataContext
的绑定尝试使用正确的Path=DataContext.<property-name>, Source={x:Reference <element-name>}
将过滤器移动到框架元素的资源中。使用StaticResource
参考您需要的过滤器。
此解决方法对binding in collection containers很有用。例如。
代码应该是这样的(未经测试):
<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>