C#/ WPF:使GridViewColumn可见= false?

有没有人知道是否有一个选项隐藏GridViewColumn以这种方式:

     

非常感谢!

编辑:为清楚起见

不幸的是,没有“IsVisible”属性。 我正在寻找一种方法来创造它。

编辑:基于反馈的解决方案如下:

    public class WidthToBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return (int)value > 0; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

谢谢大家!
干杯

编辑:反映修改后的问题。

如何创建0宽度列? 写一个布尔值给宽度IValueConverter,它将ColumnIsVisible作为ConverterParmeter?

  public class BooleanToWidthConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture){ return ((bool) parameter)? value : 0; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){ throw new NotImplementedException(); } } 

就像是:

          

这是另一种基于将列宽度设置为零的解决方案。 我修改了一下。 它现在的工作原理如下:

  1. 使用bool-to-visibility转换器将标头的可见性绑定到ViewModel的布尔属性
  2. 使用标题上的附加属性将列的宽度设置为零

这是代码。

XAML:

   

BooleanToVisibilityConverter:

 public class BooleanToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { bool param = bool.Parse(value.ToString()); if (param == true) return Visibility.Visible; else return Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 

附加行为GridViewBehaviors.CollapseableColumn:

 public static readonly DependencyProperty CollapseableColumnProperty = DependencyProperty.RegisterAttached("CollapseableColumn", typeof(bool), typeof(GridViewBehaviors), new UIPropertyMetadata(false, OnCollapseableColumnChanged)); public static bool GetCollapseableColumn(DependencyObject d) { return (bool)d.GetValue(CollapseableColumnProperty); } public static void SetCollapseableColumn(DependencyObject d, bool value) { d.SetValue(CollapseableColumnProperty, value); } private static void OnCollapseableColumnChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { GridViewColumnHeader header = sender as GridViewColumnHeader; if (header == null) return; header.IsVisibleChanged += new DependencyPropertyChangedEventHandler(AdjustWidth); } static void AdjustWidth(object sender, DependencyPropertyChangedEventArgs e) { GridViewColumnHeader header = sender as GridViewColumnHeader; if (header == null) return; if (header.Visibility == Visibility.Collapsed) header.Column.Width = 0; else header.Column.Width = double.NaN; // "Auto" } 

我已将列宽度=“0”设置为零。 现在该列看起来不可见。 但我不知道它是否会影响其他任何事情。 它可能是一个虚拟的解决方案,但现在它的工作原理。

一种更简单的方法,仍然使用将列宽设置为零但没有使用IValueConverter (用户仍然可以将列IValueConverter更宽)的副作用的概念是创建一个返回基于宽度的新getter / setter在您的ColumnIsVisible变量上然后绑定到该变量:

 public double ColumnWidth { get { if (this.ColumnIsVisible) { return 100; } else { return 0; } } set { OnPropertyChanged("ColumnWidth"); } } 

进行绑定TwoWay并且如果用户尝试拖动列更宽,将调用OnPropertyChanged并将宽度重置为0.您可能必须使用绑定代理来绑定。 在更新ColumnIsVisible时添加对OnPropertyChanged("ColumnWidth")的调用:)

如果Thumb.DragDelta可以解决问题,请使用

我在listview中使用它作为

  public Window1() { InitializeComponent(); MyListView.AddHandler(Thumb.DragDeltaEvent, new DragDeltaEventHandler(Thumb_DragDelta), true ); void Thumb_DragDelta(object sender, DragDeltaEventArgs e) { Thumb senderAsThumb = e.OriginalSource as Thumb; GridViewColumnHeader header = senderAsThumb.TemplatedParent as GridViewColumnHeader; if (header.Column.ActualWidth < MIN_WIDTH) { header.Column.Width = MIN_WIDTH; } if (header.Column.ActualWidth > MAX_WIDTH) { header.Column.Width = MAX_WIDTH; } } }