Question

J'ai trouvé la collection Columns dans mon DataGrid et espérais itérer à travers elle de trouver un certain nom de colonne. Cependant, je ne peux pas comprendre comment résoudre le attribut x: Nom de la colonne. Ce XAML illustre mon problème avec un DataGridTextColumn et un 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>

Et voici mon code:

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

Lors de l'exécution, aucune valeur est présente; column.GetValue ne retourne rien. En utilisant Snoop, je confirme qu'il n'y a pas de propriété Nom de chaque DataGridTextColumn ou DataGridTemplateColumn.

Qu'est-ce que je manque?

Était-ce utile?

La solution

WPF a deux différents, mais des concepts similaires, x: Nom, qui est utilisé pour créer un champ qui fait référence à un élément défini dans XAML, à savoir la connexion de votre code-behind à votre XAML et FrameworkElement.Name, qui est le nom unique d'un élément dans un NameScope.

Si un élément possède une propriété FrameworkElement.Name, x: Nom définira cette propriété à la valeur donnée en XAML. Cependant, il y a des cas où il est utile de lier des éléments non FrameworkElement aux champs dans le code-behind, comme dans votre exemple.

Voir cette question connexe:

En WPF, quelles sont les différences entre les x: attributs et Nom

Comme alternative, vous pouvez définir votre propre propriété jointe qui peut être utilisé pour nommer les colonnes. La propriété attachée est définie comme suit:

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(""));

}

Vous pouvez ensuite attribuer un nom à chaque colonne ...

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>

Accédez ensuite ce nom dans le code comme suit:

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

L'espoir qui aide

Autres conseils

Vous pouvez utiliser la requête LINQ pour trouver le nom de la colonne DataGrid en-têtes

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

où dgvReports est le nom du DataGrid.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top