2つの並べ替え可能な列があるのと同じように、複数の列で並べ替えるようにWPFデータグリッドを設定するには、プライマリ並べ替えの最初の列のヘッダーをクリックしてから、セカンダリ並べ替えの2番目の列のヘッダーをクリックします。ユーザーが2番目の列ヘッダーをShiftキーを押しながらクリックしなくても、最初の列のヘッダーをクリックすると、複数列の並べ替えが自動的に行われるようにしたいと思います。これを完全にxamlで行う方法はありますか?そうでない場合は、コードビハインドでこれをどのように行うことができますか?現在VB.Netを使用していますが、C#スニペットがある場合はそれを使用できます。ありがとう!
これを行うには、次のようにSystem.ComponentModel名前空間を追加します。
xmlns:scm="clr-namespace:System.ComponentModel;Assembly=WindowsBase"
次に、CollectionViewSource XAML内で新しいSortDescriptionsを次のように追加します。
<CollectionViewSource … >
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Column1"/>
<scm:SortDescription PropertyName="Column2"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
これにより、データグリッドがcolumn1、column2で並べ替えられます。
編集:
また、C#コードビハインドを使用してこれを行うのは非常に簡単です:
private void btnSort_Click(object sender, RoutedEventArgs e)
{
System.Windows.Data.CollectionViewSource myViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("The_ViewSource_Name")));
myViewSource.SortDescriptions.Add(new SortDescription("Column1", ListSortDirection.Ascending));
myViewSource.SortDescriptions.Add(new SortDescription("Column2", ListSortDirection.Ascending));
}
Edit2:
列ヘッダーの左マウスクリックイベントをキャッチし、次のようにグリッドがその列でソートされないようにする回避策を作成できます。
このコードをグリッドPreviewMouseLeftButtonUpイベントに追加します。
private void myDataGrid_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) &&
!(dep is DataGridCell) &&
!(dep is DataGridColumnHeader))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null)
return;
if (dep is DataGridColumnHeader)
{
DataGridColumnHeader columnHeader = dep as DataGridColumnHeader;
// check if this is the wanted column
if (columnHeader.Column.Header.ToString() == "The_Wanted_Column_Title")
{
System.Windows.Data.CollectionViewSource myViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("myViewSource")));
myViewSource.SortDescriptions.Clear();
myViewSource.SortDescriptions.Add(new SortDescription("Column1", ListSortDirection.Ascending));
myViewSource.SortDescriptions.Add(new SortDescription("Column2", ListSortDirection.Ascending));
}
else
{
//usort the grid on clicking on any other columns, or maybe do another sort combination
System.Windows.Data.CollectionViewSource myViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("myViewSource")));
myViewSource.SortDescriptions.Clear();
}
}
}
このコードを変更および拡張して、要件を達成できます。
これが他の人の役に立つことを願っています。私のソリューションは、デフォルトの並べ替え機能を維持し、複数の列での並べ替えを許可します。
データグリッドに並べ替えイベントを配置します
<DataGrid x:Name="dataGridName" Sorting="dataGridName_Sorting">
そして今あなたのコードの後ろに
private void dataGridName_Sorting(object sender, DataGridSortingEventArgs e)
{
var dgSender = (DataGrid) sender;
var cView = CollectionViewSource.GetDefaultView(dgSender.ItemsSource);
//Alternate between ascending/descending if the same column is clicked
ListSortDirection direction = ListSortDirection.Ascending;
if (cView.SortDescriptions.FirstOrDefault().PropertyName == e.Column.SortMemberPath)
direction = cView.SortDescriptions.FirstOrDefault().Direction == ListSortDirection.Descending ? ListSortDirection.Ascending : ListSortDirection.Descending;
cView.SortDescriptions.Clear();
AddSortColumn((DataGrid)sender, e.Column.SortMemberPath, direction);
//To this point the default sort functionality is implemented
//Now check the wanted columns and add multiple sort
if (e.Column.SortMemberPath == "WantedColumn")
{
AddSortColumn((DataGrid)sender, "SecondColumn", direction);
}
e.Handled = true;
}
private void AddSortColumn(DataGrid sender, string sortColumn, ListSortDirection direction)
{
var cView = CollectionViewSource.GetDefaultView(sender.ItemsSource);
cView.SortDescriptions.Add(new SortDescription(sortColumn, direction));
//Add the sort arrow on the DataGridColumn
foreach (var col in sender.Columns.Where(x => x.SortMemberPath == sortColumn))
{
col.SortDirection = direction;
}
}
DataGridColumnのsortDirectionを使用すると、グリッドに矢印を表示できます。