2012-01-11 9 views
3

はここに私のコードです:列が設計時に知られていないのではプログラムでバインドDataGridTemplateColumn

foreach (var columnData in lookup.DataProvider.Metadata) 
    { 
     DataGridColumn column = new DataGridTextColumn { Binding = new Binding(columnData.FieldName) }; 

     if (columnData.DataType == typeof(bool)) 
     { 
      column = new DataGridCheckBoxColumn { Binding = new Binding(columnData.FieldName) }; 
     } 

     if (columnData.DataType == typeof(DateTime)) 
     { 
      column = new DataGridTemplateColumn(); 
      //... ???? 
     } 

     column.Header = columnData.Caption; 

     DataDataGrid.Columns.Add(column); 
    } 

は基本的に、私はコード内の列とのバインディングを作成しています。

今はテンプレート化された列を追加する必要があり、C#での書き方がわかりません。興味のある場合、誰かに

<sdk:DataGridTemplateColumn Header="Received" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Width="Auto" SortMemberPath="SomeTime"> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <MyControls:MyDateTimeLabel DisplayUtcDate="{Binding SomeTime}" /> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

EDIT

:ここで私は追加する必要がある列のXAMLの例です。私はここからソリューションを使用しました:http://www.pettijohn.com/2011/01/silverlight-datagrid-with-dynamic.html

私はXAMLローダーでバージョンを取った。私の名前空間などが文字列にハードコードされているので、間違いなく匂いがする。

私は第二の選択肢を探求し始めました。動的列がどのように表示されるかを次に示します。

column = new DataGridTemplateColumn 
      { 
       CanUserSort = true, 
       SortMemberPath = columnData.FieldName, 
       CellTemplate = (DataTemplate)this.Resources["DateTimeColumnDataTemplate"] 
      }; 

私はリソースからDateTemplateをロードしています。これはクールでしたが、バインディングはどのようにして行いますか?ここでの提案は、私のDateTimeLabelに行き、バインディングを設定することでした。しかし、それはうまくいかなかった(理由についての記事を参照)。だから、私はこのコードを書いたし、すべてが順調です:

private void OnLoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     foreach (DataGridColumn t in this.DataDataGrid.Columns) 
     { 
      if (t is DataGridTemplateColumn) 
      { 
       var label = t.GetCellContent(e.Row) as DitatDateTimeLabel; 
       label.SetBinding(DitatDateTimeLabel.DisplayUtcDateProperty, new Binding(t.SortMemberPath)); 
      } 
     } 
    } 
+0

暗闇の中で撮影しましたが、私はsilverlight/xamlの専門知識を持っていませんでしたが、 '.DataBind()'のようなものはありませんか? – Aidiakapi

+0

はい、でも、どの列、どのヘッダなどを制御したいのですか? – katit

+0

Linqは 'IEnumerable 'のすべてに対して '.Select()'拡張メソッドを持っています。匿名型でそれを使ってコントロールできますか? (やはり私はSilverlightの仕組みが分からないので、MSプログラミングの他の分野での経験から推測したものです) – Aidiakapi

答えて

2

あなたは、あなたのDataTemplatePage/UserControl内部のリソースを置くのコードでそれを取得し、あなたのコラムのCellTemplateに適用することができます。 DataGrid行レベルであなたのDataContextは項目自体に設定されますので、それが今、あなたのDataTemplate XAMLであるように動作するはずです

column.CellTemplate = (DataTemplate)this.Resources["DateTimeFieldTemplate"];

バインディング:それはこのようにかなっなります。

+0

ありがとう!実際には、私はそれを "悪い"方法でやった:http://www.pettijohn.com/2011/01/silverlight-datagrid-with-dynamic.html この記事はあなたの提案も示しているが、どうすればよいだろうか? 'DisplayUtcDate'がどのフィールドにバインドするかを動的に指定します。私は本当にあなたが示唆していることをしたいのですが、これまでどうすればよいのか分かりません。 – katit

+2

'DataTemplate'がロードされている場合、' DependencyObject content = template.LoadContent() 'を実行できます。データテンプレートがあなたのコードで提示したものであれば、 'content'はあなたの' MyDateTimeLabel'コントロールになります。コントロールのSetBindingメソッドを使用して、動的にバインディングを設定できます。これは、 '((MyDateTimeLabel)content).SetBinding(MyDateTimeLabel.DisplayUtcDateProperty、someBinding)'のようになります。 'someBinding'はいくつかのプロパティへのバインディングです(' CheckBox'や 'TextBox'に対して行ったことと似ています) – dmusial

+0

私の編集を参照してください。私は各行の負荷にバインディングを設定しなければなりませんでした。そうでなければ動作しませんでした。しかし、今はコード内にXAML文字列がないといいです。役に立つポインタをありがとう! – katit

関連する問題