【问题标题】:Binding textbox in ListView's header datatemplate to a filter property将 ListView 的标题数据模板中的文本框绑定到过滤器属性
【发布时间】:2011-08-02 09:12:57
【问题描述】:

我正在创建一个自定义的列表视图标题,它具有标题文本,但也有一个文本框,您可以输入该文本框来过滤该列的内容。我的代码目前如下所示:

<UserControl.Resources>
        <DataTemplate x:Key="myHeaderTemplate">
            <StackPanel>
                <TextBlock FontSize="14" Foreground="DarkBlue" Margin="20,4" Text="{Binding}" />
                <TextBox Text="" Margin="4,2" />
            </StackPanel>
        </DataTemplate>
</UserControl.Resources>

这是包含texbox的标题数据模板的定义;和列表视图

<ListView ItemsSource="{Binding Path=MyData}" IsSynchronizedWithCurrentItem="True">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Last Name" HeaderTemplate="{StaticResource myHeaderTemplate}"
                            DisplayMemberBinding="{Binding Path=Something}" />
            <GridViewColumn Header="First Name" HeaderTemplate="{StaticResource myHeaderTemplate}" 
                            DisplayMemberBinding="{Binding Path=Something}" />
            <GridViewColumn Header="Address" HeaderTemplate="{StaticResource myHeaderTemplate}" 
                            DisplayMemberBinding="{Binding Path=Tube}" />
        </GridView>
    </ListView.View>
</ListView>

我希望能够构建一个过滤器语句,我可以将其应用于列表视图行,但要做到这一点,我必须从标题模板中的每个过滤器文本框中获取数据。

我可以以某种方式将标题中的文本框绑定到我的视图模型上的属性吗?如果没有,还有其他方法可以获取文本吗?

感谢您的帮助。

【问题讨论】:

    标签: wpf listview binding listbox datatemplate


    【解决方案1】:

    您应该能够将标头绑定到这样的属性:

    <GridViewColumn 
        Header="{Binding LastNameFilter, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" 
        HeaderTemplate="{StaticResource myHeaderTemplate}"
        DisplayMemberBinding="{Binding Path=Something}" />
    

    需要RelativeSource 才能访问ListView 的DataContext - 您也可以为其命名并改用ElementName。

    现在你可以创建一个HeaderFilter 类:

    public class HeaderFilter
    {
        public string Name { get; set; }
        public string Filter { get; set; }
    }
    

    显然,当Filter 更改为执行过滤时,您需要扩展该类以挂钩事件。

    为您的ListView 的DataContext 对象上的每个列标题放置一个属性(可能提供MyData 的同一对象)

    public class SomeClass
    {
        ....
        public HeaderFilter LastNameFilter { get; set; }
        ....
    }
    

    【讨论】:

    • 出色的回答 ChrisWue,这就是门票。非常感谢您的精彩解释!
    • ChrisWue 我正在尝试您的建议,但我很难理解您在上面使用的绑定语句,特别是 Header="{Binding LastNameFilter, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView} }}"
    • ChrisWue 我正在尝试您的建议,但我很难理解您在上面使用的绑定语句,特别是 Header="{Binding LastNameFilter, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView} }}" 这个语句是获取 ListView 的数据上下文的 LastNameFilter 属性还是试图获取 ListView 本身的 LastNameFilter 属性?应该改为 Binding DataContext.LastNameFilter 吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多