我在数据杂志中找到了列集合,并希望通过它迭代以找到某个列名。但是,我不知道如何解决列的x:名称属性。这个XAML用datagridtextcolumn和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>

这是我的代码:

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

在运行时,没有任何值; column.getValue不会返回任何内容。使用Snoop,我确认在DataGridTextColumn或DataGridTemplateColumn上都没有名称属性。

我想念什么?

有帮助吗?

解决方案

WPF具有两个不同但相似的概念x:name,用于创建一个字段,该字段引用了XAML中定义的元素,即将您的代码 - 主题连接到您的XAML和FrameworkElement.name,该元素在一个中唯一地将一个元素在a中的元素命名。名称。

如果元素具有frameworkelement.name属性,则x:名称将将此属性设置为XAML中给出的值。但是,在某些情况下,将非Frameworkelement元素链接到代码范围的字段(例如在您的示例中)很有用。

请参阅此相关问题:

在WPF中,X:名称和名称属性之间有什么区别?

作为替代方案,您可以定义自己的附件属性,该属性可用于命名列。附件的属性定义如下:

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

}

然后,您可以为每列分配一个名称...

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>

然后在代码中访问此名称,如下所示:

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

希望有帮助

其他提示

您可以使用LINQ查询查找DataGrid列标题的名称

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

DGVReports是DataGrid的名称。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top