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

Posted

技术标签:

【中文标题】C#/WPF:使 GridViewColumn 可见 = false?【英文标题】:C#/WPF: Make a GridViewColumn Visible=false? 【发布时间】:2010-11-26 10:35:44 【问题描述】:

有谁知道是否可以像这样隐藏 GridViewColumn:

<ListView.View>
    <GridView>
        <GridViewColumn Header="Test" IsVisible="Binding Path=ColumnIsVisible" />
    </GridView>
<ListView.View>

非常感谢!

编辑:为清楚起见

很遗憾,没有“IsVisible”属性。我正在寻找一种方法来创建它。

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

<GridViewColumn DisplayMemberBinding="Binding Path=OptionColumn1Text" 
                Width="Binding Path=SelectedEntitiy.OptionColumn1Width">
    <GridViewColumnHeader Content="Binding Path=SelectedEntitiy.OptionColumn1Header" IsEnabled="Binding Path=SelectedEntitiy.OptionColumn1Width, Converter=StaticResource widthToBool" />
</GridViewColumn>

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();
    

谢谢大家! 干杯

【问题讨论】:

【参考方案1】:

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

创建一个宽度为 0 的列怎么样?写一个 Boolean 到 Width 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();
        
    

类似:

<ListView .. >
 <ListView.Resources>
  <BooleanToWidthConverter x:Key="boolToWidth" />
 </ListView.Resources>

 <ListView.View>
    <GridView>
        <GridViewColumn 
                  Header="Test" 
                  Width=
      "Binding Path=ColumnWidth, 
                Converter=StaticResource boolToWidth, 
                ConverterParameter=ColumnIsVisible" />
    </GridView>
 <ListView.View>

【讨论】:

感谢您的快速回复。不幸的是,没有“IsVisible”属性..所以我正在寻找一种方法来创建它。 评论您的编辑:这仍然允许用户调整列的大小,不幸的是也没有启用属性。 @Joseph :GridViewColumn 本身没有 IsEnabled 属性,但 GridViewColumnHeader (继承自 ButtonBase)上有一个。所以你可以在 HeaderContainerStyle 中设置 IsEnabled +1 用于将列宽设置为 0。有关使用附加行为的变体,请参阅我的回复。 将宽度设置为 0 仍将使其可扩展,因此将其重新显示在 UI 上。【参考方案2】:

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

我在listview中使用它

<ListView x:Name="MyListView"IsSynchronizedWithCurrentItem="True"   
      ItemsSource="Binding Path=Items",  Mode=Default, Source=StaticResource DataProvider" 
      Thumb.DragDelta="Thumb_DragDelta">


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;   
 


【讨论】:

【参考方案3】:

Here 是另一种基于将列宽设置为零的解决方案。我稍微修改了一下。它现在是这样工作的:

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

这里是代码。

XAML:

<GridViewColumn
    HeaderTemplate="..." 
    HeaderContainerStyle="...">
    <GridViewColumnHeader 
        Content="Header text" 
        Visibility="Binding AppliesToColumnVisible, Converter=StaticResource BooleanToVisibilityConverter" 
        behaviors:GridViewBehaviors.CollapseableColumn="True" />

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"

【讨论】:

【参考方案4】:

我已将列设置为width="0"。 现在该列看起来不可见。但是不知道会不会影响别的。 这可能是一个虚拟的解决方案,但现在它可以工作。

【讨论】:

用户仍然可以拖动列宽【参考方案5】:

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

public double ColumnWidth

    get
    
        if (this.ColumnIsVisible)
        
            return 100;
        
        else
        
            return 0;
        
    

    set
    
        OnPropertyChanged("ColumnWidth");
    

进行双向绑定,如果用户尝试将列拖得更宽,OnPropertyChanged 将被调用并将宽度重置为 0。尽管您可能必须使用绑定代理进行绑定。每当更新 ColumnIsVisible 时,还要添加对 OnPropertyChanged("ColumnWidth") 的调用 :)

【讨论】:

以上是关于C#/WPF:使 GridViewColumn 可见 = false?的主要内容,如果未能解决你的问题,请参考以下文章

WPF:如何使用XAML隐藏GridViewColumn?

WPF 在 GridViewColumn.CellTemplate 的 DataTemplate 中绑定 UserControl 属性

WPF:将Combobox添加到GridViewColumn标头中

WPF MVVM:如何将 GridViewColumn 绑定到 ViewModel-Collection?

wpf中的listview如何改变GridViewColumn以及Title的水平对齐方式

如何自动调整大小和WPF右对齐GridViewColumn数据