using System.Collections.Generic; using System.Linq; using System.Windows.Controls; using System.Windows.Data; namespace DTS.Common.Controls { public class AutoSizedGridView : GridView { HashSet _allColumns; HashSet _autoWidthColumns; Dictionary _widthBoundColumns; protected override void PrepareItem(ListViewItem item) { if (null == _allColumns || !Columns.Select(col => col.GetHashCode()).SequenceEqual(_allColumns)) { _allColumns = new HashSet(); _autoWidthColumns = new HashSet(); _widthBoundColumns = new Dictionary(); 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); } } }