我在确定点击哪个listview列标题时遇到了一些问题。在XAML中,我有这个:
ListView Name="myListView" ItemsSource="{Binding MyItemList}" GridViewColumnHeader.Click="ListView_Click"
点击列标题后,我就像这样处理:
private void ListView_Click(object sender, RoutedEventArgs e)
{
GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
string header = headerClicked.Column.Header as string;
[...]
这就是我在许多样本中看到按列完成排序的方式。在此之后,我使用标题来确定要排序的列,并进行排序。
我的问题是headerClicked.Column.Header是列标题的显示名称,对于不同的语言是不同的。有没有办法获得一些不依赖于显示/语言的其他类型的标识符,而不是依赖于“标题”字符串?
谢谢!
答案 0 :(得分:0)
为什么不使用IComparer和custom sorter并一起忽略标题?这将删除您与UI的关系以及您正在显示的内容,并允许您专注于业务对象(模型),这是焦点所在。如此大量使用UI是永远不可扩展的,并且会在某个时间点产生维护问题,如果还没有的话。
答案 1 :(得分:0)
最简单的方法是在标题上使用Name属性(或Tag属性),改变你的xaml,如下所示:
<ListView Height="100" HorizontalAlignment="Left" Margin="10,10,0,0" Name="listView1" VerticalAlignment="Top" Width="234">
<ListView.View>
<GridView>
<GridViewColumn Width="100">
<GridViewColumnHeader Name="Sort1" Content="Header1" Click="Header_Click"/>
</GridViewColumn>
<GridViewColumn Width="100">
<GridViewColumnHeader Name="Sort2" Content="Header2" Click="Header_Click"/>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
然后你可以改变你的处理程序:
private void Header_Click(object sender, RoutedEventArgs e) {
GridViewColumnHeader header = sender as GridViewColumnHeader;
String sort = header.Name;
// Sort code here...
return;
}
答案 2 :(得分:0)
您可以使用DisplayMemberBinding:
Binding b = headerClicked.Column.DisplayMemberBinding as Binding;
string header = b != null ? b.Path.Path as string : null;
或者,您可以使用要使用的名称为每个标头声明附加属性并使用它。
康斯坦丁