web-dev-qa-db-ja.com

WPFのDatagrid-1列のデフォルトでソート

WPFには、いくつかの列を持つDataGridがあります。

デフォルトでは、ソートしたい1がありますが、どうすればそれができるかわかりません。

XAMLのDataGridは次のようになります。

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
                <DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" />
                <DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
            </DataGrid.Columns>
        </DataGrid>

そして、その背後にある唯一のコードは次のとおりです。

public ScoreBoard()
{
    InitializeComponent();
    DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml");
    XElement TrackList = XElement.Parse(ds.GetXml());
    LibraryView.DataContext = TrackList;
}

私が見つけられないのは、デフォルトで「スコア」列でソートする方法です。

誰かが私を正しい方向に向けるのを手伝ってくれますか?

26
Dante1986

注: CollectionViewSourceを使用すると、これらの状況でより多くのパワーと制御が提供されます。 WPFを学習しているときは、CollectionViewSourceを使用してこの問題を解決する方法を理解することをお勧めします。これにはGroupingFilteringなどの他のコレクション関連の問題も含まれます。

編集:これは仕様の変更が原因である可能性があります。この答えは.NET 4.0の使用に基づいています。このソリューションが古いバージョンのフレームワークで機能するかどうかは調査していません。

このXAMLを考える

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
            <DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" />
            <DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>

必要なのは、列を選択し、その列の並べ替え方向を指定することだけです。

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
                <DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" SortDirection="Ascending" />
                <DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
            </DataGrid.Columns>
        </DataGrid>

これにより、デフォルトで昇順の2番目の列へのソートが行われます。

47
SomeInternetGuy

ここで最初の列でコードをソートする方法を説明しました: Initial DataGrid Sorting

全体のアプローチは複雑に思えますが、特定の目的の列でソートするようにコードを適合させることができます。

XAMLでそれを実行したい場合、動作するのはCollectionViewSource.SortDescriptionsの設定です:

<CollectionViewSource x:Key="cvs" Source="{StaticResource myItemsSource}">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="MyPropertyName" Direction="Ascending"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

しかし、私は後者を試したことがない。

10
doblak

プログラムで実行する場合は、次のように実行できます。

 MyDataGrid.ItemsSource = DataContext.RowItems.OrderBy(p => p.Score).ToList();
3
Charles Clayton

コードビハインドでICollectionViewを使用できます。 ObservableCollection<yourPersonClass> Personsを定義し、NamesがyourPersonClassのプロパティであると仮定します

public ICollectionView View; 
View = CollectionViewSource.GetDefaultView(Persons);
View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
View.Refresh();
2
Gideon