ne peut pas trouver Nom de DataGridColumn programme
-
14-10-2019 - |
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?
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.