我正在创建一个自定义的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上的属性吗?如果没有,还有其他方法来获取文本吗?
感谢您的帮助。
答案 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