DataGrid
を動的に生成し、それをWPFアプリケーションのStackPanel
に追加しています。ダイナミックDataGridでTextWrapを有効にする
動的に生成されるので、同じものに対してXAML側にマークアップはなく、プログラムですべてのプロパティとバインディングを管理する必要があります。
私のDataGrid
は、テキストが長い場合、次の行に折り返されたセルの値を持つことを望みます。 DataGridCell
をTextBlock
に置き換え、TextWrap
プロパティを設定する必要があることを理解しています。私が見つけたすべての例は、それらの行自体に何かを示唆しています。しかし、私はXAMLを使わずにコードの背後から完全にそれを行う方法を見つけることができませんでした。
これまでのところ、次のコードを試しましたが、動作しません。
DataGrid dg = new DataGrid();
dg.ItemsSource = ((DataSet)data).Tables[0].DefaultView;
dg.DataContext = ((DataSet)data).Tables[0].DefaultView;
DataTemplate ct = new DataTemplate(typeof(DataGridCell));
FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
tb.SetValue(TextBlock.TextWrappingProperty, TextWrapping.Wrap);
ct.VisualTree = tb;
dg.ItemTemplate = ct;
dg.ColumnWidth = 300;
ここに正しい方向を教えていただけますか?
[更新]:ソリューション
さらに再探索で私は私の問題の解決策を得ることができました。自動生成された列の場合は、AutoGeneratingColumn
イベントをキャプチャし、デフォルトのDataGridTextColumn
をDataGridTemplateColumn
で置き換えます。TextBlock
になります。次に、テキストをラップするために `TextWrappingProperty 'を設定することができます。
後は更新されたコードです:
DataGrid dg = new DataGrid();
dg.ItemsSource = ((DataSet)data).Tables[0].DefaultView;
dg.DataContext = ((DataSet)data).Tables[0].DefaultView;
DataTemplate ct = new DataTemplate(typeof(DataGridCell));
FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
tb.SetValue(TextBlock.TextWrappingProperty, TextWrapping.Wrap);
ct.VisualTree = tb;
dg.AutoGeneratingColumn += new EventHandler<DataGridAutoGeneratingColumnEventArgs>(dg_AutoGeneratingColumn);
dg.MaxColumnWidth = 300;
[イベントハンドラの下のコード:私は言わなければならない
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
//cancel the auto generated column
e.Cancel = true;
//Get the existing column
DataGridTextColumn dgTextC = (DataGridTextColumn)e.Column;
//Create a new template column
DataGridTemplateColumn dgtc = new DataGridTemplateColumn();
DataTemplate dataTemplate = new DataTemplate(typeof(DataGridCell));
FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
tb.SetValue(TextBlock.TextWrappingProperty, TextWrapping.Wrap);
dataTemplate.VisualTree = tb;
dgtc.Header = dgTextC.Header;
dgtc.CellTemplate = dataTemplate;
tb.SetBinding(TextBlock.TextProperty, dgTextC.Binding);
//add column back to data grid
DataGrid dg = sender as DataGrid;
dg.Columns.Add(dgtc);
}
さらなる調査で、私は 'AutoGeneratingColumn'イベントをキャプチャし、そこに' DataTemplate'を適用する必要があることを発見しました。私はその作業を進めていますが、新しい列型にバインドされた値を取得するのには時間がかかります。 –