DatagridColumnの名前をプログラムで見つけることができません
-
14-10-2019 - |
質問
Datagridで列コレクションを見つけ、特定の列名を見つけるために繰り返して繰り返したいと思っていました。ただし、列の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には、XAMLで定義された要素を参照するフィールドを作成するために使用される2つの異なる、しかし類似した概念、X:名前、つまりXAMLにコードビハインドを接続するフィールド、およびframeworkelement.nameがあります。 namesscope。
要素にframeworkelement.nameプロパティがある場合、x:名前はこのプロパティをxamlで与えられた値に設定します。ただし、例のように、非フレームワークセレメント要素をコードビハインドのフィールドにリンクすることが役立つ場合があります。
この関連する質問を参照してください:
別の方法として、列の名前に使用できる独自の添付プロパティを定義できます。添付のプロパティは次のように定義されています。
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の名前です。