将ListView的标题datatemplate中的文本框绑定到过滤器属性

时间:2011-04-10 06:40:59

标签: wpf listview binding listbox datatemplate

我正在创建一个自定义的listview标题,其中包含标题文本,但也有一个文本框,您可以输入该文本框来过滤该列的内容。我的代码目前看起来像这样:

<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的头datatemplate的定义;和列表视图

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

我希望能够构建一个可以应用于listview行的过滤器语句,但为此,我必须从头模板中的每个过滤器文本框中获取数据。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

需要RelativeSource才能访问DataContext的{​​{1}} - 您也可以为其命名并改为使用ListView

现在你可以制作一个ElementName课程:

HeaderFilter

显然,当public class HeaderFilter { public string Name { get; set; } public string Filter { get; set; } } 更改为执行过滤时,您需要扩展该类以挂钩事件。

为对象上的每个列标题添加一个属性,即Filter的{​​{1}}(可能提供DataContext的同一个对象)

ListView