有点晚了,但我认为这可能仍然有用:
根据A.Pissicat、Surfen和Ben McMillan的代码(和注释),我已经更新了
GridViewColumnVisibilityManager
,如下所示:
public static class GridViewColumnVisibilityManager
{
public static readonly DependencyProperty IsVisibleProperty =
DependencyProperty.RegisterAttached(
"IsVisible",
typeof(bool),
typeof(GridViewColumnVisibilityManager),
new UIPropertyMetadata(true, OnIsVisibleChanged));
private static readonly ConditionalWeakTable<GridViewColumn, ColumnValues> OriginalColumnValues = new ConditionalWeakTable<GridViewColumn, ColumnValues>();
public static bool GetIsVisible(DependencyObject obj) => (bool)obj.GetValue(IsVisibleProperty);
public static void SetIsVisible(DependencyObject obj, bool value) => obj.SetValue(IsVisibleProperty, value);
private static void OnIsVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is GridViewColumn gridViewColumn))
{
return;
}
if (!GetIsVisible(gridViewColumn))
{
var columnValues = OriginalColumnValues.GetOrCreateValue(gridViewColumn);
columnValues.Width = gridViewColumn.Width;
columnValues.Style = gridViewColumn.HeaderContainerStyle;
gridViewColumn.Width = 0;
gridViewColumn.HeaderContainerStyle = null;
}
else if (gridViewColumn.Width == 0
&& OriginalColumnValues.TryGetValue(gridViewColumn, out var columnValues))
{
gridViewColumn.HeaderContainerStyle = columnValues.Style;
gridViewColumn.Width = columnValues.Width;
}
}
private class ColumnValues
{
public Style Style { get; set; }
public double Width { get; set; }
}
}
如果您希望在隐藏列时使用特定的
HeaderContainerStyle
Style
而不是
null
,请将以下代码替换为:
gridViewColumn.HeaderContainerStyle = columnValues.Style;
改为:
gridViewColumn.HeaderContainerStyle = Application.Current.TryFindResource(@"disabledColumn") as Style;
并将@"disabledColumn"
更改为您想要使用的任何名称。