考虑以下WPF/C#程序:显示和ListView中由不同的值进行排序
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.ComponentModel;
namespace ListViewSorting
{
public partial class MainWindow : Window
{
public List<SomeClass> someList;
public List<SomeClass> SomeList
{
get { return someList; }
set { someList = value; }
}
public MainWindow()
{
this.DataContext = this;
someList = new List<SomeClass>();
someList.Add(new SomeClass(123));
someList.Add(new SomeClass(456));
someList.Add(new SomeClass(789));
InitializeComponent();
}
GridViewColumnHeader _lastHeaderClicked = null;
ListSortDirection _lastDirection = ListSortDirection.Ascending;
private void listBox1_Click(object sender, RoutedEventArgs e)
{
someGridView.Columns.ToString();
GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
ListSortDirection direction;
if (headerClicked != null)
{
if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
{
if (headerClicked != _lastHeaderClicked)
{
direction = ListSortDirection.Ascending;
}
else
{
if (_lastDirection == ListSortDirection.Ascending)
{
direction = ListSortDirection.Descending;
}
else
{
direction = ListSortDirection.Ascending;
}
}
string header1 = headerClicked.Column.Header as string;
string header2 = (string)((Binding)((GridViewColumnHeader)e.OriginalSource).Column.DisplayMemberBinding).Path.Path;
Sort(header2, direction);
_lastHeaderClicked = headerClicked;
_lastDirection = direction;
}
}
}
private void Sort(string sortBy, ListSortDirection direction)
{
ICollectionView dataView = CollectionViewSource.GetDefaultView(someListView.ItemsSource);
dataView.SortDescriptions.Clear();
SortDescription sd = new SortDescription(sortBy, direction);
dataView.SortDescriptions.Add(sd);
dataView.Refresh();
}
}
public class SomeClass
{
private int someValue;
public int SomeValue
{
get { return someValue; }
set { someValue = value; }
}
public SomeClass(int someValue)
{
this.someValue = someValue;
}
public string StringValue
{
get
{
string str = someValue.ToString();
string returnValue = string.Empty;
foreach (char someChar in str)
{
switch (someChar)
{
case '0': returnValue += "ZERO "; break;
case '1': returnValue += "ONE "; break;
case '2': returnValue += "TWO "; break;
case '3': returnValue += "THREE "; break;
case '4': returnValue += "FOUR "; break;
case '5': returnValue += "FIVE "; break;
case '6': returnValue += "SIX "; break;
case '7': returnValue += "SEVEN "; break;
case '8': returnValue += "EIGHT "; break;
case '9': returnValue += "NINE "; break;
default: returnValue += "UNKNOWN "; break;
}
}
return returnValue;
}
}
}
}
...和以下WPF:
<Window x:Class="ListViewSorting.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel Orientation="Vertical">
<ListView
x:Name="someListView"
Height="251"
HorizontalAlignment="Left"
GridViewColumnHeader.Click="listBox1_Click"
Margin="22,29,0,0"
VerticalAlignment="Top"
Width="453"
ItemsSource="{Binding SomeList}">
<ListView.View>
<GridView x:Name="someGridView">
<GridViewColumn Width="50" Header="SomeValue" DisplayMemberBinding="{Binding Path=SomeValue}" />
<GridViewColumn Width="100" Header="StringValue" DisplayMemberBinding="{Binding Path=StringValue}" />
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</Grid>
</Window>
该代码创建对象的列表,每其中能够保存一个整数值。 WPF创建一个绑定到此列表的表,并在两个单独的列中显示列表中项目的数值和字符串值。因此,例如,对于整数值123,第一列将显示“123”,而第二列将显示“一两个三”。
单击第一列的标题正确地按照升序/降序对值进行排序。单击第二列的标题不会正确排序值,因为例如字符串'FOUR FIVE SIX''小于'字符串'ONE TWO THREE'。
我想第二列正确排序,换句话说,第二列显示类的'StringValue'字符串字段,但按'SomeValue'整数字段排序。