我遇到了wpf工具包DataGrid
的问题。
我有一个ItemsSource
,其中有三列:
姓
名字
地址
在C#代码隐藏中,我设置了排序方向和要排序的列,如下所示:
ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription("LastName", ListSortDirection.Ascending));
view.Refresh();
实际排序没有问题,但标题中有视觉样式。如果用户通过单击标题对列进行排序,则视觉样式会更改,但视觉样式不表示以编程方式设置列排序描述。
为什么会这样,以及如何切换标题以使其显示为已排序?
答案 0 :(得分:13)
我之前没有尝试过,但我认为你可以设置列的SortDirection属性。
int columnIndex = 0;
this.dataGrid1.ColumnFromDisplayIndex(columnIndex).SortDirection =
ListSortDirection.Descending;
答案 1 :(得分:1)
下面的示例将让您使用组合框对数据网格进行排序,并直接单击数据网格。
XAML:
<Window x:Class="DataGridDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=System"
Height="300" Width="300">
<Window.Resources>
<ObjectDataProvider MethodName="GetValues"
ObjectType="{x:Type System:Enum}"
x:Key="SortDirections">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="ComponentModel:ListSortDirection" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<StackPanel>
<ComboBox
Name="_columnsComboBox"
ItemsSource="{Binding Path=Columns, ElementName=_dataGrid}"
DisplayMemberPath="Header"
SelectionChanged="OnSort" />
<ComboBox
Name="_sortDirectionsComboBox"
ItemsSource="{Binding Source={StaticResource SortDirections}}"
SelectionChanged="OnSort" />
<Controls:DataGrid
Name="_dataGrid"
ItemsSource="{Binding Path=PeopleData}" />
</StackPanel>
</Window>
代码背后:
using System;
using System.ComponentModel;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using Microsoft.Windows.Controls;
namespace DataGridDemo
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
PeopleData = new DataTable();
PeopleData.Columns.Add(new DataColumn("Name", typeof(string)));
PeopleData.Columns.Add(new DataColumn("Age", typeof(int)));
var row = PeopleData.NewRow();
row["Name"] = "Sara";
row["Age"] = 25;
PeopleData.Rows.Add(row);
row = PeopleData.NewRow();
row["Name"] = "Bob";
row["Age"] = 37;
PeopleData.Rows.Add(row);
row = PeopleData.NewRow();
row["Name"] = "Joe";
row["Age"] = 10;
PeopleData.Rows.Add(row);
DataContext = this;
}
public DataTable PeopleData { get; private set;}
private void OnSort(object sender, SelectionChangedEventArgs e)
{
if (_sortDirectionsComboBox.SelectedIndex == -1 || _columnsComboBox.SelectedIndex == -1)
{
return;
}
foreach (DataGridColumn dataColumn in _dataGrid.Columns)
{
dataColumn.SortDirection = null;
}
ListSortDirection sortDescription = (ListSortDirection)(_sortDirectionsComboBox.SelectedItem);
DataGridColumn selectedDataColumn = _columnsComboBox.SelectedItem as DataGridColumn;
selectedDataColumn.SortDirection = sortDescription;
ICollectionView view = CollectionViewSource.GetDefaultView(_dataGrid.ItemsSource);
view.SortDescriptions.Clear();
view.SortDescriptions.Add(new SortDescription(selectedDataColumn.Header as string, sortDescription));
view.Refresh();
}
}
}
答案 2 :(得分:0)
如果要将有效排序同步到列上的Visual样式,这应该会有所帮助:
( (INotifyCollectionChanged)Items.SortDescriptions ).CollectionChanged += new NotifyCollectionChangedEventHandler( OnItemsSortDescriptionsChanged );
private void OnItemsSortDescriptionsChanged( object sender, NotifyCollectionChangedEventArgs e )
{
//Synchronize effective sorting in the grid and Visual style on columns
if ( Items != null )
{
foreach ( DataGridColumn column in Columns )
{
column.SortDirection = null;
foreach ( SortDescription sd in Items.SortDescriptions )
{
if ( column.SortMemberPath == sd.PropertyName )
{
column.SortDirection = sd.Direction;
break;
}
}
}
}
}