26

DataGrid名前列を含むいくつかの列を持つWPFアプリがあります。ユーザーが特定のビューに切り替えた場合、データを名前で事前に並べ替えたい(そして、ユーザーがそのヘッダーをクリックしたかのように、名前ヘッダーに並べ替え矢印を表示したい)。ただし、これを実現するために期待されるプロパティが見つかりません。SortColumn、、などSortColumnIndexのようなものを探していましたSortDirection

マークアップ(XAML)でデフォルトの並べ替え列と方向を指定することは可能ですか、それともWPFツールキットでサポートされていませんDataGridか?

4

5 に答える 5

47

WPF Toolkit DataGrid コントロールについて話していると仮定すると、CanUserSortColumns プロパティを true に設定し、DataGrid 内の各 DataGridColumnの SortMemberPath プロパティを設定するだけで済みます。

最初にコレクションを並べ替える限り、CollectionViewSource を使用して並べ替えを設定し、それを DataGrid の ItemsSource として割り当てる必要があります。XAML でこれを行っている場合は、次のように簡単になります。

<Window.Resources>
    <CollectionViewSource x:Key="MyItemsViewSource" Source="{Binding MyItems}">
        <CollectionViewSource.SortDescriptions>
           <scm:SortDescription PropertyName="MyPropertyName"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</Window.Resources>

<DataGrid ItemsSource="{StaticResource MyItemsViewSource}">

</DataGrid>

注:「scm」名前空間プレフィックスは、SortDescription クラスが存在する System.ComponentModel にマップされます。

xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"

編集:この投稿から十分な数の人々が助けを得たと思います。この投票されたコメントをこの回答に含める必要があります:

これを機能させるには、これを使用する必要がありました。

<DataGrid ItemsSource="{Binding Source={StaticResource MyItemsViewSource}}">
于 2009-10-26T20:37:37.920 に答える
18

これは古い投稿であることは知っていますが、Drew Marsh の回答に加えて、列ヘッダーの矢印が表示されないという DanM の問題に対応して...SortDirection プロパティを DataGridColumn に追加する必要があります。

<DataGridTextColumn Header="Name" Binding="{Binding Name}" SortDirection="Ascending" />

私はこれについて質問を投稿し、数日後に答えを見つけました:

XAML で DataGrid を並べ替えると、ColumnHeader の矢印が反映されない

于 2011-07-29T14:55:03.213 に答える
5

ItemsSource が CollectionViewSource 例外をサポートしていない場合は、次のように、DataGrid の DataContext を 'MyItemsViewSource' として、ItemsSource を {Binding} として設定できます。

<DataGrid DataContext="{StaticResource MyItemsViewSource}" ItemsSource="{Binding}">
</DataGrid>
于 2009-12-18T11:43:20.230 に答える
3

例外が表示ItemsSource doesn't support CollectionViewSourceされたら、コレクションを DataGrid に参照する前に、Linq でコレクションを並べ替えることができます。

ObservableCollection<MyDataClass> myCollection = new ObservableCollection<MyDataClass>();
dataGrid.ItemsSource = from item in myCollection orderby item select item;

IComparable次へのインターフェイスを実装する必要がありMyDataClassます。

public class MyDataClass : IComparable<MyDataClass> {
    public int CompareTo(Classified other) {
        return other.Value.CompareTo(this.Value); // DESC
        return this.Value.CompareTo(other.Value); // ASC
    }
}
于 2009-11-11T11:07:57.570 に答える
0

これは私にとってはうまくいきます。

ListSortDirection sortDirection;
int selectedColumnIndex;
private void customerDataGrid_Sorting(object sender, DataGridSortingEventArgs e)
{
    selectedColumnIndex = e.Column.DisplayIndex;
    sortDirection = (e.Column.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending: ListSortDirection.Ascending);
}

private void applySortDescriptions(ListSortDirection listSortDirection)
{
    //Clear current sort descriptions 
    customerDataGrid.Items.SortDescriptions.Clear();

    //Get property name to apply sort based on desired column 
    string propertyName = customerDataGrid.Columns[selectedColumnIndex].SortMemberPath;

    //Add the new sort description 
    customerDataGrid.Items.SortDescriptions.Add(new SortDescription(propertyName, listSortDirection));

    //apply sort 
    applySortDirection(listSortDirection);

    //refresh items to display sort 
    customerDataGrid.Items.Refresh();
}

private void applySortDirection(ListSortDirection listSortDirection)
{
    customerDataGrid.Columns[selectedColumnIndex].SortDirection = listSortDirection;
}
于 2017-05-29T08:50:20.747 に答える