gpt4 book ai didi

wpf - 无法以编程方式找到 DataGridColumn 的名称

转载 作者:行者123 更新时间:2023-12-04 14:22:39 27 4
gpt4 key购买 nike

我在我的数据网格中找到了 Columns 集合,并希望遍历它以找到某个列名称。但是,我不知道如何解决该列的 x:Name 属性。这个 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 上没有 Name 属性。

我错过了什么?

最佳答案

WPF 有两个不同但相似的概念,x:Name,用于创建引用 XAML 中定义的元素的字段,即将您的代码隐藏到您的 XAML,以及 FrameworkElement.Name,它唯一命名一个元素名称范围。

如果元素具有 FrameworkElement.Name 属性,x:Name 会将此属性设置为 XAML 中给定的值。但是,在某些情况下,将非 FrameworkElement 元素链接到代码隐藏中的字段很有用,例如在您的示例中。

看到这个相关的问题:

In WPF, what are the differences between the x:Name and Name attributes?

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

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));
}

希望有帮助

关于wpf - 无法以编程方式找到 DataGridColumn 的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4588757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com