2016-06-01 10 views
0

私はWPF-Datagridを使用するWPFアプリケーションを持っています。列見出しをクリックすると列を並べ替えることができ、自動的に動作します。私が望むのは、プログラムの開始時に列をプログラムで選択して並べ替えることです。別の言い方をすると、私はユーザーが列見出しをクリックしたように思っていますが、プログラマチックに、MVVMの方法で、コードの変更を省略しています。そのための解決策はありますか?WPF DataGrid:列をプログラム的にMVVMの方法でソートしますか?

+0

したがって、ユーザーは列ヘッダーをクリックしても、並べ替えコードはビューモデルにする必要がありますか? –

+0

Timothy、いいえ、私はあなたが誤解していたと思います。ユーザーが列見出しを押したという要件なしで、プログラムで並べ替えを実行します。別の言い方をすると、私のDataGridのデフォルトソートです。はい、列の見出しが正しいソート方向を示しています。 – Erik

答えて

0

リストがある場合はLinqクエリを使用し、DataTablesを使用している場合はMyRows = myTable.Select(strExpr、strSort);を使用します。

まず、あなたがしてソートする列を選択する必要があり、その後のviewmodelで、あなたは使用することができますすることができますいずれかのLINQ ormyTable.Select(strExpr、strSort)

例コード

switch(columnname) 
    { 
    case "name": 
    break; 

    case "FatherName" 
    break; 
    } 
4

は私が推測しますこれを行う「MVVM Way」は、DataGridをオブジェクトコレクションを表すCollectionViewにバインドしており、SortDescriptionプロパティを使用して並べ替えを管理できます。

private ObservableCollection<Entity> _entityCollection = null; 
public ObservableCollection<Entity> EntityCollection 
{ 
    get 
    { 
     return _entityCollection; 
    } 
    set 
    { 
     _entityCollection = value; 
     RaisePropertyChanged("EntityCollection"); 
     RaisePropertyChanged("CollectionView"); 
    } 
} 

注上記RaisePropertyChanged("CollectionView")

は、例えば、あなたのviewmodelにあなたはオブジェクトのコレクション持っているあなたのコレクションの変更を、ビューはcollectionviewが同様に変更されたことを通知する必要があります。

ので、代わりのコレクションに直接データグリッドをバインドしますが、このような読み取り専用collectionviewプロパティ定義:変更したい場合は最後に

<DataGrid ItemsSource="{Binding Path=CollectionView}"> 

private CollectionView _collectionView = null; 
public CollectionView CollectionView 
{ 
    get 
    { 
     _collectionView = (CollectionView)CollectionViewSource.GetDefaultView(EntityCollection); 
     if (_collectionView != null) 
      _collectionView.SortDescriptions.Add(new SortDescription("PropertyName", ListSortDirection.Ascending)); 
     return _collectionView; 
    } 
} 

次に、あなたがあなたのデータグリッドをバインドしますコレクションがソートされるプロパティは、コレクションビューの並べ替えをクリアし、次のように新しいものを追加する必要があります。

_collectionView.SortDescriptions.Clear(); 
_collectionView.SortDescriptions.Add(new SortDescription("NewPropertyName", ListSortDirection.Ascending)); 
関連する問題