5

データグリッドでColumnsコレクションを見つけ、それを繰り返し処理して特定の列名を見つけることを望んでいました。ただし、列のx:Name属性をアドレス指定する方法がわかりません。このxamlは、DataGridTextColumnとDataGridTemplateColumnに関する私の問題を示しています。

<t:DataGrid x:Name="dgEmployees" ItemsSource="{Binding Employees}" 
    AutoGenerateColumns="false" Height="300" >
    <t:DataGrid.Columns>
        <t:DataGridTextColumn x:Name="FirstName" Header="FirstName"
Binding="{Binding FirstName}" />
        <t:DataGridTemplateColumn x:Name="LastName" Header="LastName" >
            <t:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding LastName}" />
                </DataTemplate>
            </t:DataGridTemplateColumn.CellTemplate>
        </t:DataGridTemplateColumn>
    </t:DataGrid.Columns>
</t:DataGrid>

そしてここに私のコードがあります:

    DataGrid dg = this.dgEmployees;
    foreach (var column in dg.Columns) 
    {
        System.Console.WriteLine("name: " + (string)column.GetValue(NameProperty));
    }

実行時には、値は存在しません。column.GetValueは何も返しません。Snoopを使用して、DataGridTextColumnまたはDataGridTemplateColumnのいずれにもNameプロパティがないことを確認しました。

私は何が欠けていますか?

4

2 に答える 2

14

WPFには、XAMLで定義された要素を参照するフィールドを作成するために使用されるx:Name、つまりコードビハインドをXAMLに接続するために使用される、2つの異なるが類似した概念と、内の要素に一意の名前を付けるFrameworkElement.Nameがあります。 namescope。

要素にFrameworkElement.Nameプロパティがある場合、x:NameはこのプロパティをXAMLで指定された値に設定します。ただし、例のように、FrameworkElement以外の要素を分離コード内のフィールドにリンクすると便利な場合があります。

この関連する質問を参照してください:

WPFでは、x:Name属性とName属性の違いは何ですか?

別の方法として、列に名前を付けるために使用できる独自の添付プロパティを定義することもできます。添付プロパティは次のように定義されます。

public class DataGridUtil
{

    public static string GetName(DependencyObject obj)
    {
        return (string)obj.GetValue(NameProperty);
    }

    public static void SetName(DependencyObject obj, string value)
    {
        obj.SetValue(NameProperty, value);
    }

    public static readonly DependencyProperty NameProperty =
        DependencyProperty.RegisterAttached("Name", typeof(string), typeof(DataGridUtil), new UIPropertyMetadata(""));

}

次に、各列に名前を割り当てることができます...

xmlns:util="clr-namespace:WPFDataGridExamples"

<t:DataGrid x:Name="dgEmployees" ItemsSource="{Binding Employees}" 
    AutoGenerateColumns="false" Height="300" >
    <t:DataGrid.Columns>
        <t:DataGridTextColumn util:DataGridUtil.Name="FirstName" Header="FirstName"
Binding="{Binding FirstName}" />
        <t:DataGridTemplateColumn util:DataGridUtil.Name="LastName" Header="LastName" >
            <t:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding LastName}" />
                </DataTemplate>
            </t:DataGridTemplateColumn.CellTemplate>
        </t:DataGridTemplateColumn>
    </t:DataGrid.Columns>
</t:DataGrid>

次に、次のようにコードでこの名前にアクセスします。

DataGrid dg = this.dgEmployees;
foreach (var column in dg.Columns) 
{
    System.Console.WriteLine("name: " + DataGridUtil.GetName(column));
}

お役に立てば幸い

于 2011-01-04T08:37:58.417 に答える
1

linqクエリを使用して、データグリッド列ヘッダーの名前を見つけることができます

dgvReports.Columns.Select(a=>a.Header.ToString()).ToList()

ここで、dgvReportsはデータグリッドの名前です。

于 2016-08-11T06:32:46.703 に答える