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(); } }
就像是:
这是另一种基于将列宽度设置为零的解决方案。 我修改了一下。 它现在的工作原理如下:
- 使用bool-to-visibility转换器将标头的可见性绑定到ViewModel的布尔属性
- 使用标题上的附加属性将列的宽度设置为零
这是代码。
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; } } }