C#/WPF: Make a GridViewColumn Visible=false?

后端 未结 5 963
无人共我
无人共我 2021-02-13 02:08

Does anyone know if there is an option to hide a GridViewColumn somehow like this:


    
        

        
相关标签:
5条回答
  • 2021-02-13 02:19

    I've set the column the width="0". Now the column looks like its not visible. But i do not know if it will affect anything else. It might be a dummy solution but for now it works.

    0 讨论(0)
  • 2021-02-13 02:22

    Edit: Reflecting the modified question.

    What about creating a 0 width column? Write a Boolean to Width IValueConverter, that takes a ColumnIsVisible as the 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();
            }
        }
    

    Something like:

    <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>
    
    0 讨论(0)
  • 2021-02-13 02:24

    Use if Thumb.DragDelta may solve the problem

    I use it in listview as

    <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;   
     }
    }
    }
    
    0 讨论(0)
  • 2021-02-13 02:25

    Here is another solution based on setting the column's width to zero. I have modified it a little. It now works like this:

    1. Bind the header's visibility to a boolean property of the ViewModel, using a bool-to-visibility converter
    2. Use an attached property on the header to set the column's width to zero

    Here is the code.

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

    Attached behavior 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 讨论(0)
  • 2021-02-13 02:36

    One simpler approach, that still uses the concept of setting the columns width to zero but does not have the side effects of using a IValueConverter (the user can still drag the column wider) is to create a new getter/setter that returns a width based on your ColumnIsVisible variable and then bind to that:

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

    Make your bindings TwoWay and if the user attempts to drag the column wider OnPropertyChanged will be called and reset the width to 0. You might have to use a binding proxy though for your binding. Also add a call to OnPropertyChanged("ColumnWidth") when ever ColumnIsVisible is updated :)

    0 讨论(0)
提交回复
热议问题