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

时间:2014-11-26 19:16:11

标签: c# wpf xaml data-binding

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

我有一个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。如果你处于相同的情况,你们更喜欢哪些解决方案?????

1 个答案:

答案 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>