DataGridColumnからDataGridColumnHeaderを取得する方法は?
-
26-09-2019 - |
質問
次のように
私のコードは次のとおりです。
void mainDataContextObj_CutSelectedColumnEvent(string columnId)
{
IList<DataGridColumn> columns = dg.Columns;
for(int i=2; i<dg.Columns.Count; i++)
{
DataGridColumnHeader headerObj = dg.Columns[i].Header as DataGridColumnHeader;
//This always returns headerObj as null!!!
}
}
私は、カラムからDataGridColumnHeader
必要があります。どこが間違っているんだ?
解決
のDataGridColumnのヘッダーオブジェクトは、実際にはそれがなるように設定何その列の可視ヘッダです。 DataGridColumnのは、ビジュアルツリーの一部ではないので、アクセスするための直接的な方法は、(私たちも、必ずそれがまだ存在することはできません)それをDataGridColumnHeaderありません。しかし、あなたがしようとするために、このような何かを行うことができアクセスも
DataGridColumnHeader headerObj = GetColumnHeaderFromColumn(column);
private DataGridColumnHeader GetColumnHeaderFromColumn(DataGridColumn column)
{
// dataGrid is the name of your DataGrid. In this case Name="dataGrid"
List<DataGridColumnHeader> columnHeaders = GetVisualChildCollection<DataGridColumnHeader>(dataGrid);
foreach (DataGridColumnHeader columnHeader in columnHeaders)
{
if (columnHeader.Column == column)
{
return columnHeader;
}
}
return null;
}
public List<T> GetVisualChildCollection<T>(object parent) where T : Visual
{
List<T> visualCollection = new List<T>();
GetVisualChildCollection(parent as DependencyObject, visualCollection);
return visualCollection;
}
private void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is T)
{
visualCollection.Add(child as T);
}
else if (child != null)
{
GetVisualChildCollection(child, visualCollection);
}
}
}
他のヒント
潜在的にコードの他の部分で再利用することができ、追加のメソッドをリファクタリングのアプローチを提供する フレドリックの答えながら、私は1つの方法への彼の方法を統合することが好ましいです。それはヘッダを検出し、それは(これはほとんどの場合に最も可能性の高い無視できる)ビジュアルツリー内のすべての子を検索し続ける必要はありませんと、それはすぐに検索を終了することができますので、また、いくつかの小さなパフォーマンスのゲインがあるかもしれません。
private DataGridColumnHeader GetHeader(DataGridColumn column, DependencyObject reference)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(reference); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(reference, i);
DataGridColumnHeader colHeader = child as DataGridColumnHeader;
if ((colHeader != null) && (colHeader.Column == column))
{
return colHeader;
}
colHeader = GetHeader(column, child);
if (colHeader != null)
{
return colHeader;
}
}
return null;
}
そして、それはそうと同じように使用されます:
DataGridColumnHeader colHeader = GetHeader(column, myDataGrid);
if (colHeader == null) { /* Not found */ }
所属していません StackOverflow