61 lines
2.4 KiB
C#
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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|