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?

È stato utile?

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top