按列排序ListView的问题

时间:2010-10-15 22:30:31

标签: wpf listview

我在确定点击哪个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是列标题的显示名称,对于不同的语言是不同的。有没有办法获得一些不依赖于显示/语言的其他类型的标识符,而不是依赖于“标题”字符串?

谢谢!

3 个答案:

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

或者,您可以使用要使用的名称为每个标头声明附加属性并使用它。

康斯坦丁