DataGrid устарел, но я столкнулся с той же проблемой при изменении устаревшего кода, поэтому я опубликую свое решение.
Проблема в том, что DataGrid имеет закрытое поле myGridTable , в котором хранится текущий DataGridTableStyle
. Текущий DataGridTableStyle
существует, даже если коллекция TableStyles
пуста, и в этом случае она указывает на значение по умолчанию DataGridTableStyle
, которое также является личным / внутренним.
Поскольку DataGrid в любом случае устарел и не будет изменен, я решил просто использовать Reflection для доступа к этим закрытым полям . В любом случае, они должны были быть публичными, и сделать их личными было плохим дизайнерским решением IMO.
Преимущество работы с текущими стилями напрямую заключается в том, что вам не нужно уничтожать и воссоздавать стили таблиц только для изменения ширины, и каждый раз это работает без неожиданного поведения.
Я создал несколько методов расширения, чтобы сделать это:
static class DataGridColumnWidthExtensions
{
public static DataGridTableStyle GetCurrentTableStyle(this DataGrid grid)
{
FieldInfo[] fields = grid.GetType().GetFields(
BindingFlags.NonPublic |
BindingFlags.Instance);
return (DataGridTableStyle)fields.First(item => item.Name == "myGridTable").GetValue(grid);
}
public static IList<int> GetColumnWidths(this DataGrid grid)
{
var styles = grid.GetCurrentTableStyle().GridColumnStyles;
var widths = new int[styles.Count];
for (int ii = 0; ii < widths.Length; ii++)
{
widths[ii] = styles[ii].Width;
}
return widths;
}
public static void SetColumnWidths(this DataGrid grid, IList<int> widths)
{
var styles = grid.GetCurrentTableStyle().GridColumnStyles;
for (int ii = 0; ii < widths.Count; ii++)
{
styles[ii].Width = widths[ii];
}
}
}