2016-10-19 12 views
0

の最初の列のソートデータグリッドを有効にします。は、私が自動生成されたカラムを持つWPFのデータグリッドを持っているXAML

は、どのように私は自分のソースで時間を対応する第1の1を除くすべての行のソート機能を無効にすることができます。

私はMVVMパターンを、次のと私はCanUserSortColumnsは、すべての列のソート無効化されていることを知っています。最初の列以外のすべてを無効にしたい

は私がトリガまたは相互作用または何か他のものを書くべきですか?すべての助けに感謝します。

<DataGrid AutoGenerateColumns="True" 
     ItemsSource="{Binding MyDataTable}" 
     CanUserSortColumns="False"> 
</DataGrid> 

答えて

1

私はこのコードをあなたのためのsnippetが見つかりました:

<my:DataGridTemplateColumn SortMemberPath="CompleteDate" Header="Complete Date" CanUserSort="true"> 
      <my:DataGridTemplateColumn.CellTemplate > 
        <DataTemplate> 
         <TextBlock> 
          <TextBlock.Text> 
           <Binding Path="CompleteDate" ConverterCulture="en-GB" StringFormat="{}{0:MM/dd/yyyy}"/> 
          </TextBlock.Text> 
         </TextBlock> 
        </DataTemplate> 
       </my:DataGridTemplateColumn.CellTemplate> 
      </my:DataGridTemplateColumn> 

は、それが明示的なソート可能な状態列の定義するCanUserSortプロパティを使用します。 SortMemberPathはソートに使用するプロパティを定義します。お役に立てれば。

更新: 自動生成された列を使用している場合は、xaml経由でアクセスすることはできません。だからあなたはcodeファイルでそれらにアクセスする必要があります。

私は、XAMLグリッドに慣れていないんだけど、何かのように期待する:元型名は異なりますが、この方法は可能なはず何かできる

//Bound Data here so that the Grid generate the columns 

int i = 0; 
foreach (DataColumn column in myGrid.ColumnCollection) 
{ 
    if (i == 0) 
     column.CanSortUser = true; 
    else 
     column.CanSortUser = false; 

    i++; 
} 

を。あなたはMVVMを傷つけたくない場合は

UPDATE-2

あなたはthisを使用することができます。インターフェイスを使用してコードにアクセスし、ビューとビューモデルで独立したままにする方法が説明されています。

+0

私は列を自動生成しているため、「ItemsSourceを使用する前にアイテムコレクションが空でなければなりません。」というような例外が発生しますので、私にとってはうまくいきません。 –

+0

@stackerflow xaml経由では不可能です。しかし、xamlはPropertiesを使用するときに何もしていません。したがって、列を自動生成する場合は、コードファイルのこの列にアクセスできる必要があります。 Iamはxamlグリッドに慣れていませんが、myGrid.ColumnCollection [0] .CanUserSort =値をfalseに設定した他のすべての列に対してtrueを試してみてください。この方法を使用する前に必ず列を生成する必要があります。 – Sebi

+0

はい、コードで扱うことができますが、私はMVVMパターンを使用していますが、実際にはviewModelとビューを結合したくありません。可能な回避策があれば、本当に便利です。 –

2

問題はDataGridColumnHeaderがローカル計算プロパティとしてCanUserSort性質を有していること、です。手動で列を生成することで設定できます(不必要なもの)。

セッターを持つプロパティの場合は、TabIndex == 0のDataTriggerを作成し、xamlスタイルのSetterに設定できます。

<DataGrid AutoGenerateColumns="True" 
    ItemsSource="{Binding MyDataTable}" 
    CanUserSortColumns="True" 
    AutoGeneratedColumns="DataGrid_OnAutoGeneratedColumns"> 
</DataGrid> 

あなたの分離コード:

private void DataGrid_OnAutoGeneratedColumns(object sender, EventArgs e) 
{ 
    DataGrid dg = sender as DataGrid; 
    if (dg == null) return; 
    dg.Columns.ToList().Select((col, indx) => new {Col = col, Indx = indx}).ToList().ForEach(obj => obj.Col.CanUserSort = obj.Indx == 0); 
} 

これは、最初の列UserCanSortプロパティを有効にし、他人を無効

AutoGeneratedColumnsを使用して、あなたの唯一のチャンスは次のとおりです。この機能はviewmodelから独立しており、view.xaml.csコードビハインドファイルに置くことができます。

EDIT:

あなたがちょうどあなた自身のDataGridControlを使用することによってそれを行うことができます任意の分離コードを持っていない場合。

MyDataGrid。CS

namespace YourNamespace { 
    public class MyDataGrid : DataGrid 
    { 
     protected override void OnAutoGeneratedColumns(EventArgs e) 
     { 
      DataGrid dg = sender as DataGrid; 
      if (dg == null) return; 
      dg.Columns.ToList().Select((col, indx) => new {Col = col, Indx = indx}).ToList().ForEach(obj => obj.Col.CanUserSort = obj.Indx == 0); 

      base.OnAutoGeneratedColumns(e); 
     } 
    } 
} 

ビュー:

<YourNamespace:MyDataGrid AutoGenerateColumns="True" 
    ItemsSource="{Binding MyDataTable}" 
    CanUserSortColumns="True"> 
</YourNamespace:MyDataGrid> 

、あなたは、単一の行の分離コードなしで行われます。

+0

主なポイントは、コードをコードに書きたくないということです。私はコードビハインドを書くことができない厳格なMVVMパターンに従っています。 –

+0

私はこれを理解することができます。しかし、この答えの解決策は、あなたの 'DataGrid'コントロールの動作の拡張であり、データやビジネスロジックから完全に独立しています。したがって、3行はMVVMパターンに反しません。それらはxamlとxaml.cs(コードビハインド)で構成されるビューに属します。私はあなたのviewmodelにこれらの行を入れないことに同意します! – WPFGermany

+0

@stacker flow:投稿を更新しました。 **編集** – WPFGermany

関連する問題