не может найти имя DataGridColumn программно - PullRequest
5 голосов
/ 04 января 2011

Я нашел коллекцию 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.

Чего мне не хватает?

Ответы [ 2 ]

13 голосов
/ 04 января 2011

WPF имеет два разных, но схожих понятия: x: Name, которое используется для создания поля, которое ссылается на элемент, определенный в XAML, т. Е. Соединяет ваш программный код с вашим XAML, и FrameworkElement.Name, который уникально называетэлемент в области имен.

Если элемент имеет свойство FrameworkElement.Name, x: Name установит для этого свойства значение, указанное в XAML.Однако в некоторых случаях полезно связать элементы, не относящиеся к FrameworkElement, к полям в выделенном фрагменте кода, как, например, в вашем примере.

См. Этот связанный вопрос:

В чем разница между атрибутами x: Name и Name в WPF?

В качестве альтернативы выможет определить ваше собственное присоединенное свойство, которое можно использовать для именования столбцов.Присоединенное свойство определяется следующим образом:

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));
}

Надеюсь, это поможет

1 голос
/ 11 августа 2016

Вы можете использовать запрос linq, чтобы найти имя столбца таблицы данных. Заголовки

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

, где dgvReports - имя сетки данных.

...