1

私の質問はかなり単純に思えます:

WPFでデータバインドされたDataGridにカスタムヘッダーを追加するにはどうすればよいですか?

なぜ私はこの質問をしているのですか? えーと、DataGrid (コード ビハインドで生成される) に、列挙可能な「リスト」にバインドされた動的な項目ソースを合わせたからです。プロパティ名を列ヘッダーとして使用していますが、これは問題なく機能します。

読みやすさを向上させるために、カスタムヘッダーを列に割り当てたいだけですが...私の考えは、列が既に定義されているデータグリッドを提供し、アイテムソースで行を埋めることでした。しかし、itemssource は列だけでなく行も扱います。

ここで私の問題を確認していただければ幸いです。助けていただければ幸いです。

4

5 に答える 5

1

DataGridクラスには、「AutoGenerateColumns」(リンク)と呼ばれる列生成動作を構成するためのプロパティがあります。この動作を無効にするには、falseに設定するだけです。

xamlで行うと、DataGridの形状をより適切に制御できます。例:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="MainWindow"
    Width="525"
    Height="350">
<Grid>                  
    <DataGrid AutoGenerateColumns="False" >
        <DataGrid.Columns>              
            <DataGridTextColumn Header="MyHeader1" Binding="{Binding MyProperty1}"/>
            <DataGridTextColumn Binding="{Binding MyProperty2}">
                <DataGridTextColumn.Header>
                    <Button Content="A button"/>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

ご覧のとおり、列定義の「Header」プロパティは、さらにカスタマイズする場合は、すべてのコンテンツ、テキスト、またはコントロールを受け入れます。

編集

WindowのLoadedイベントで、コードビハインドからそれを行う方法の例:

void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var dataGrid = new DataGrid();
        dataGrid.AutoGenerateColumns = false;

        // For each column you want
        var column1 = new DataGridTextColumn();
        column1.Header = "MyHeader";
        column1.Binding = new Binding("MyProperty");
        dataGrid.Columns.Add(column1);

        // LayoutRoot is the main grid of the Window
        this.LayoutRoot.Children.Add(dataGrid);


        // Let's test to see if the binding is working
        IEnumerable<DummyClass> testEnumerable = new List<DummyClass>(){
            new DummyClass(){MyProperty= "Element1"},
            new DummyClass(){MyProperty= "Element2"},
        };

        dataGrid.ItemsSource = testEnumerable;
    }
于 2012-11-19T15:49:48.527 に答える
1

コード ビハインドから DataGrid を作成している場合は、DataContextおよび でバインドするすべてのものを指定できますBindings

があるとしましょうDataGrid myDataGrid

ItemsSource を次のようにバインドしmyDataGridます。

 Binding dataGridItemsSourceBinding = new Binding("MyItemsSourceName");
 myDataGrid.SetBinding(DataGrid.ItemsSourceProperty, datagridItemsSourceBinding);

DataGridTemplateColumn を作成する

 DataGridTemplateColumn templatecolumn = new DataGridTemplateColumn() {
      Header = "myColumnName", // Add the name of your column here
 };

DataGrid 列の DataCell に値を表示するときのデータ テンプレートを作成します。

 // Displaying Template for when you display the DataCell in the DataGridColumn
 // Create a Data Template for when you are displaying a DataGridColumn
 DataTemplate textBlockTemplate = new DataTemplate();
 // Create a Framework Element for the DataGridColumn type (In this case, a TextBlock)
 FrameworkElementFactory textBlockElement = new FrameworkElementFactory(typeof(TextBlock));
 // Create a Binding to the value being displayed in the DataGridColumn
 Binding textBlockBinding = new Binding("myPropertyName");
 // Assign the Binding to the Text Property of the TextBlock
 textBlockElement.SetBinding(TextBlock.TextProperty, textBlockBinding);
 // Set the DataGridColumn to stretch to fit the text
 textBlockElement.SetValue(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Stretch);
 // Add the TextBlock element to the Visual Tree of the Data Template
 textBlockTemplate.VisualTree = textBlockElement;
 // Add the Data Template to the DataGridColumn Cell Template
 templatecolumn.CellTemplate = textBlockTemplate;

DataGrid 列の DataCell の値を編集するときのデータ テンプレートを作成します。

 // Editing Template for when you edit the DataCell in the DataGridColumn
 // Create a Data Template for when you are displaying a DataGridColumn
 DataTemplate textBoxTemplate = new DataTemplate();
 // Create a Framework Element for the DataGrid Column type (In this case, TextBox so the user can type)
 FrameworkElementFactory textBoxElement = new FrameworkElementFactory(typeof(TextBox));
 // Create a Binding to the value being edited in the DataGridColumn
 Binding textBoxBinding = new Binding("myPropertyName");
 // Assign the Binding to the Text Property of the TextBox
 textBoxElement.SetBinding(TextBox.TextProperty, textBoxBinding);
 // Set the DataGridColumn to stretch to fit the text
 textBlockElement.SetValue(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Stretch);
 // Add the TextBox element to the Visual Tree of the Data Template
 textBoxTemplate.VisualTree = textBoxElement;
 // Add the Data Template to the DataGridColumn Cell Editing Template
 templatecolumn.CellEditingTemplate = textBoxTemplate;

完成した DataGridColumn を DataGrid に追加します

 // Add the completed DataGridColumn to your DataGrid
 myDataGrid.Columns.Add(templateColumn);
于 2012-11-19T15:59:18.060 に答える
1

DataGridのイベントを処理するAutoGeneratingColumnと、デフォルトの列名 (プロパティ名) とカスタム ヘッダーの間にある種のマップを作成できます。

例えば:

string headername = e.Column.Header.ToString();

if (headername == "MiddleName")
     e.Column.Header = "Middle Name";

編集: MDSNから取得

于 2012-11-19T15:41:27.987 に答える
0

AutoGenerate を使用している場合は、以下のリンクを参照してください

DataGrid.AutoGenerateColumns

または、バインドを AutoGenerate してビルドしないでください。
列が動的である場合は、コーディングする必要があります。
列が静的である場合は、XAML を使用できます。

<DataGrid Name="DG1" ItemsSource="{Binding}" AutoGenerateColumns="False" >
     <DataGrid.Columns>
          <DataGridTextColumn Header="First Name"  Binding="{Binding FirstName}"/>   
于 2012-11-19T15:35:08.587 に答える
0

毎回同じデータを取得することがわかっている場合は、列ヘッダーを定義して行を忘れることができます。同じタイプのオブジェクトのリストがあると仮定します。これは、各行に同じプロパティを表示することを意味します。Enumerable の例をいくつか提供すれば、物事は簡単になります。

XAML ファイルで列ヘッダーを定義できます。また、Columns プロパティの DataGrid のプロパティでも定義できます。

これを行う前に、リストを Datagrid の itemsource にバインドする必要があります。

于 2012-11-19T15:37:58.690 に答える