Files
DP44/Common/DTS.CommonCore/Controls/AutoSizedGridView.cs
2026-04-17 14:55:32 -04:00

61 lines
2.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Data;
namespace DTS.Common.Controls
{
public class AutoSizedGridView : GridView
{
HashSet<int> _allColumns;
HashSet<int> _autoWidthColumns;
Dictionary<int, BindingExpression> _widthBoundColumns;
protected override void PrepareItem(ListViewItem item)
{
if (null == _allColumns || !Columns.Select(col => col.GetHashCode()).SequenceEqual(_allColumns))
{
_allColumns = new HashSet<int>();
_autoWidthColumns = new HashSet<int>();
_widthBoundColumns = new Dictionary<int, BindingExpression>();
foreach (var column in Columns)
{
_allColumns.Add(column.GetHashCode());
if (double.IsNaN(column.Width) && //Width == "Auto"
null == BindingOperations.GetBindingExpression(column, GridViewColumn.WidthProperty)) //Width isn't bound
{
_autoWidthColumns.Add(column.GetHashCode());
}
else if (null != BindingOperations.GetBindingExpression(column, GridViewColumn.WidthProperty))
{
_widthBoundColumns.Add(column.GetHashCode(), BindingOperations.GetBindingExpression(column, GridViewColumn.WidthProperty));
}
}
}
foreach (var column in Columns)
{
if (_autoWidthColumns.Contains(column.GetHashCode()))
{
//force remeasure
if (double.IsNaN(column.Width))
{
column.Width = column.ActualWidth;
}
column.Width = double.NaN;
}
else if (_widthBoundColumns.ContainsKey(column.GetHashCode()))
{
//check if binding lost, re-bind
if (null == BindingOperations.GetBindingExpression(column, GridViewColumn.WidthProperty))
{
BindingOperations.SetBinding(column, GridViewColumn.WidthProperty, _widthBoundColumns[column.GetHashCode()].ParentBindingBase);
}
}
}
base.PrepareItem(item);
}
}
}