non riesce a trovare Nome di DataGridColumn di programmazione
-
14-10-2019 - |
Domanda
Ho trovato la collezione Colonne nel mio datagrid, e speravo di iterare attraverso di esso per trovare una certa colonna Nome. Tuttavia, non riesco a capire come affrontare il x: Nome attributo della colonna. Questo XAML illustra il mio problema con un DataGridTextColumn e 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>
E qui è il mio codice:
DataGrid dg = this.dgEmployees;
foreach (var column in dg.Columns)
{
System.Console.WriteLine("name: " + (string)column.GetValue(NameProperty));
}
In fase di esecuzione, nessun valore è presente; column.GetValue non restituisce nulla. Utilizzando Snoop, mi ha confermato che non v'è alcuna proprietà Nome su entrambi DataGridTextColumn o DataGridTemplateColumn.
Che cosa mi manca?
Soluzione
WPF ha due concetti diversi, eppure simili, x: nome, che viene utilizzato per creare un campo che fa riferimento a un elemento definito in XAML, vale a dire il collegamento del code-behind al tuo XAML, e FrameworkElement.Name, quali nomi univoco elemento all'interno di una NameScope.
Se un elemento ha una proprietà FrameworkElement.Name, x: Name sarà impostare questa proprietà al valore dato in XAML. Tuttavia, vi sono casi in cui è utile collegare elementi non FrameworkElement ai campi in code-behind, come nel tuo esempio.
Vai a questa domanda relativa:
In WPF, quali sono le differenze tra il x:? nome e il nome attributi
In alternativa, è possibile definire la vostra proprietà proprio allegato, che può essere utilizzato per denominare le colonne. La proprietà associata è definito come segue:
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(""));
}
È quindi possibile assegnare un nome a ciascuna colonna ...
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>
Poi accedere a questo nome in codice come segue:
DataGrid dg = this.dgEmployees;
foreach (var column in dg.Columns)
{
System.Console.WriteLine("name: " + DataGridUtil.GetName(column));
}
La speranza che aiuta ??p>
Altri suggerimenti
È possibile utilizzare query LINQ per trovare il nome della colonna DataGrid intestazioni
dgvReports.Columns.Select(a=>a.Header.ToString()).ToList()
dove dgvReports è nome del datagrid.