【问题标题】:C#/WPF: Make a GridViewColumn Visible=false?C#/WPF:使 GridViewColumn 可见 = 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();
    }
}

谢谢大家!
干杯

【问题讨论】:

    标签: c# wpf listview visibility gridviewcolumn


    【解决方案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 是另一种基于将列宽设置为零的解决方案。我稍微修改了一下。它现在是这样工作的:

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

      这里是代码。

      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") 的调用 :)

        【讨论】:

          猜你喜欢
          • 2016-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-18
          • 1970-01-01
          • 2011-03-05
          相关资源
          最近更新 更多