2012-01-26 15 views
3

Customize Auto-Generated Columnsへの優れた記事を読んだ後、私は問題に遭遇しました。DataGridコントロールで自動生成された列をカスタマイズする

DataGridコントロールで自動生成された列をカスタマイズしようとしているときに、すべての数値の列値が右揃えになっているかのような簡単な操作を行いたいとします。

<DataGrid x:Name="MyGrid" AutoGeneratingColumn="MyGrid_AutoGeneratingColumn"> 
    <DataGrid.Resources> 
    <DataTemplate x:Key="IntegerTemplate"> 
     <TextBlock Text="{Binding}" HorizontalAlignment="Right"/> 
    </DataTemplate> 
    </DataGrid.Resources> 
</DataGrid> 

を次に、AutoGeneratingColumnDataGridイベントハンドラで、私はすべての整数(つまり、数値)の列のCellTemplateとして、この一般的なDataTemplateを割り当てる:次のようにこの目的を達成するために、私はDataTemplateを作成しました

public void MyWindow_AdjustColumnTemplateBasedOnType(
       DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (/*This is a column I want to change*/) 
    { 
    DataGridTemplateColumn column=new DataGridTemplateColumn(); 

    column.Header=e.PropertyName; 
    column.CellTemplate=MyGrid.FindResource("IntegerTemplate") as DataTemplate; 
    e.Column=column; 
    } 
} 

TextBlockText列の値が望ましい結果を表示しないという問題があります。代わりに、列のCellTemplateとしてこのDataTemplateを持つ各セルの右詰めで値を見て、私は次を参照してください。"{Binding}"に属性Textを設定することにより、空のバインディング構文を使用して

enter image description here

は明らかに間違っています。パスベースのバインディングを設定すると、望ましい結果が得られます。私は(ハードコーディングされたデータ・パス)を設定した場合、それはのようなものを使用して結合、次のとおりです。

<DataGrid.Resources> 
    <DataTemplate x:Key="IntegerTemplate"> 
     <!-- Binding hard set to ProductId --> 
     <TextBlock Text="{Binding ProductId}" HorizontalAlignment="Right"/> 
    </DataTemplate> 
    </DataGrid.Resources> 

はその後、すべてがうまくありませんが、私の一般的なDataTemplateはもはや一般的なもので。代わりに、それはすべての整数の列のための再利用可能なものとの結合は、その特定のデータ項目の値に固定されているので、それは、ProductId列のみを使用することができます:

enter image description here私がすべき正しいバインディングは何

一般的なDataTemplateは、それが関連付けられている列の対応するItemSourceプロパティにある値を実際に使用するように使用します。

+0

:私はあなたが解決策を見つけるか、同じ問題を抱えている –

答えて

0

DataGridコンテキストでTemplateColumnを使用する場合は、通常ValueConverterも使用する必要があります。

このValueConverterは、ViewModelsオブジェクトからデータを変換します(実際には、通常のTextColumnの代わりにTemplateColumを使用する理由です)。

このようなコンバータを持っているか、ViewModelsオブジェクトにToString()メソッドを提供していますか?それを試していない場合、おそらくそれが役立ちます...

3

私はスタイルがあなたの問題をここで解決すると信じています。

 private void MyGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
     { 
      if (/*This is a column I want to change*/) 
      { 
       DataGridColumn column = e.Column; 
       column.CellStyle = MyGrid.FindResource("IntegerTemplate") as Style; 

      } 
     } 

とXAMLであなたは「正しい結合である私は、一般的なDataTemplateのが実際に対応するItemSourceプロパティにあるどのような値使用するので、使うべきで苦労の人々のために

<Style TargetType="DataGridCell" x:Key="IntegerTemplate"> 
    <Setter Property="FontWeight" Value="Bold"></Setter> 
</Style>  
+0

1は、これは私がそれを行う方法私が代わりに 'DataTempの' Style'を使用し、正確ですか。 「遅い」 –

1

を書くことができます関連付けられている列。「

このリンクで

参照Jay_Wangの答え:。

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8b2e94b7-3c44-4642-8acc-851de5285062

それはプログラム的に設定することができるように、重要なビットがSystem.Windows.FrameworkElement GenerateElement機能をオーバーライドしている列名を使用するように結合

希望はこのことができますマイケルGoldshteyn @

関連する問題