Frage

Ich fand die Spaltensammlung in meinem Datagrid und hoffte, sie durch sie zu iterieren, um einen bestimmten Spaltennamen zu finden. Ich kann jedoch nicht herausfinden, wie ich das Attribut X: Name der Spalte adressieren soll. Dieses XAML veranschaulicht mein Problem mit einem DataGridTextColumn und einem 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>

Und hier ist mein Code:

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

Zur Laufzeit ist kein Wert vorhanden; column.getValue gibt nichts zurück. Mit Snoop habe ich bestätigt, dass es in DataGridTextColumn oder DataGridTemPlateColumn keine Namenseigenschaft gibt.

Was vermisse ich?

War es hilfreich?

Lösung

WPF hat zwei verschiedene, aber ähnliche Konzepte, x: Name, mit dem ein Feld erstellt wird, das ein in XAML definierter Element verweist, dh Ihre Codebehind mit Ihrem XAML und FrameworkElement.name verbindet, das ein Element in einem Element eindeutig benennt NAMESCOPE.

Wenn ein Element eine FrameworkElement.name -Eigenschaft hat, setzt X: Name diese Eigenschaft auf den in XAML angegebenen Wert. Es gibt jedoch Fälle, in denen es nützlich ist, Nicht-Frameworkelement-Elemente mit Feldern in Code-Behind zu verknüpfen, z. B. in Ihrem Beispiel.

Siehe diese verwandte Frage:

Was sind in WPF die Unterschiede zwischen den Attributen X: Name und Namen?

Alternative können Sie Ihre eigene beigefügte Eigenschaft definieren, mit der die Spalten benannt werden können. Die beigefügte Eigenschaft ist wie folgt definiert:

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

}

Sie können dann jeder Spalte einen Namen zuweisen ...

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>

Greifen Sie dann wie folgt auf diesen Namen in Code zu:

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

Ich hoffe, das hilft

Andere Tipps

Sie können die LINQ -Abfrage verwenden, um den Namen der DataGrid -Spalten -Header zu finden

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

wo dgvreports Name des Datagrids ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top