4

ビュー モデルで ObservableCollection にバインドしている DataGrid があり、DataGrid が並べ替えられたときにコレクションを並べ替えて、この並べ替えられた順序を他の場所で使用できるようにする必要があります。現在、ObvservableCollection でラッパーを使用して並べ替えをサポートしています。DataGrid が並べ替えられると、表示されたデータのみが並べ替えられ、コレクション内の基になるデータは並べ替えられません。データは 1 つの整数列と 1 つの文字列列で構成され、両方で昇順と降順の並べ替えをサポートする必要があります。また、列ヘッダーをクリックして昇順と降順を切り替える標準の DataGrid 並べ替えと同じ使用法を維持したいと考えています。私は比較的 WPF に慣れていないので、データとコマンドのバインディングのすべてを知っているわけではありませんが、やりたいことを達成する方法があると思います。

<DataGrid ItemsSource="{Binding mySource}" 
          Name="myDataGrid"
          CanUserResizeRows="False"
          AutoGenerateColumns="False"
          HeadersVisibility="Column" >
    <DataGrid.Columns>

      <DataGridTemplateColumn Header="Header 1" CanUserSort="True" SortMemberPath="firstValue">
        <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding firstValue}" />
          </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>

      <DataGridTemplateColumn Header="Header 2" Width="*" CanUserSort="True" SortMemberPath="secondValue">
        <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <TextBlock Text="{Binding secondValue}" />
          </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>

    </DataGrid.Columns>
</DataGrid>

ソース データは次のようなタイプです。

public class myType
{
    public int firstValue { get; set; }
    public string secondValue { get; set; }

    // some functions and variables...
}

さて、上で述べたように、コレクション内のアイテムにソート順にアクセスする必要がありますが、具体的に ObservableCollection である必要はありません。コレクション内のアイテムにアクセスするときの現在の順序が何であれ、アイテムを反復処理できる限り、すべて問題ありません。おそらくListCollectionViewか何かを考えていました。また、コレクションに新しいアイテムが追加されたときにコレクションを再ソートしたくありません。新しいアイテムは、通常どおりコレクションの最後に追加する必要があります。

何か案は?

4

4 に答える 4

2

ICollectionView を使用して、既存のコレクションを並べ替えることができます。System.ComponentModel の下にあります。

コードは次のようになります

var collectionView = CollectionViewSource.GetDefaultView(ObservableCollection_Name);
       collectionView.SortDescriptions.Add(new SortDescription("Your Property", ListSortDirection.Descending));

GridView または ListView で、既存の ObservableCollection をバインドできます。変更する必要はありません。

于 2016-01-22T06:06:14.147 に答える