前边看过网上有许多针对WPF中ListView控件排序的例子。经过实践发现当点击列头排序后,拖拽功能就不起作用了。经过断点调试发现该排序只是针对视图的排序,而源数据并没有排序。
所以我将网上的排序方式改为:
//单击表头排序
private void Button_Click(object sender, RoutedEventArgs e)
{
if (e.OriginalSource is GridViewColumnHeader)
{
//获得点击的列
GridViewColumn clickedColumn = (e.OriginalSource as GridViewColumnHeader).Column;
//数据源集合为ObservableCollection<T>类型,保证数据源和ListView试图同步。 List<LogMessage> list = StreamHelper.List.ToList<LogMessage>();
if (clickedColumn != null)
{
list.Sort(delegate(LogMessage x, LogMessage y)
{
switch (clickedColumn.Header.ToString())
{
case "DateTime":
return x.Datetime.CompareTo(y.Datetime);
case "Value":
return x.Text.CompareTo(y.Text);
case "Type":
return x.Type.CompareTo(y.Type);
default:
break;
}
return 0;
});
StreamHelper.List.Clear();
foreach (LogMessage item in list)
{
StreamHelper.List.Add(item);
}
}
}
}
Click需要手动去写
<ListView Name="listView1" Margin="17,241,108,12" DataContext="{StaticResource message}" GridViewColumnHeader.Click="Button_Click" MouseMove="listView1_MouseMove" Drop="listView1_Drop">
<ListView.View>
<GridView x:Name="gridview1">
<GridViewColumn Header="DateTime" Width="130" DisplayMemberBinding="{Binding Datetime,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<GridViewColumn Header="Value" Width="130" DisplayMemberBinding="{Binding Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<GridViewColumn Header="Type" Width="130" DisplayMemberBinding="{Binding Type,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</GridView>
</ListView.View>
</ListView>