С#/WPF: сделать GridViewColumn видимым = false?

Кто-нибудь знает, есть ли возможность скрыть 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();
    }
}

Спасибо всем!
Ура


person Joseph jun. Melettukunnel    schedule 08.09.2009    source источник


Ответы (5)


Изменить: отражение измененного вопроса.

Как насчет создания столбца шириной 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();
        }
    }

Что-то вроде:

<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>
person Preet Sangha    schedule 08.09.2009
comment
Спасибо за быстрый ответ. К сожалению, свойства IsVisible нет... поэтому я ищу способ его создать. - person Joseph jun. Melettukunnel; 08.09.2009
comment
Комментарий к вашему редактированию: это все равно позволит пользователю изменять размер столбца, к сожалению, также нет Enabled-Property. - person Joseph jun. Melettukunnel; 08.09.2009
comment
@Joseph: в самом GridViewColumn нет свойства IsEnabled, но оно есть в GridViewColumnHeader (который наследуется от ButtonBase). Таким образом, вы можете установить IsEnabled в HeaderContainerStyle - person Thomas Levesque; 08.09.2009
comment
+1 за установку ширины столбца на 0. См. мой ответ для варианта этого с использованием прикрепленного поведения. - person Helge Klein; 03.04.2011
comment
Установка ширины на 0 по-прежнему сделает ее расширяемой, а значит, вернет ее в пользовательский интерфейс. - person Yahya; 22.08.2014
comment
@Яхья хуже; вручную увеличивая ширину столбца после того, как она была установлена ​​на 0, привязка разрывается. - person Tom Lint; 21.07.2016

Вот другое решение, основанное на установке ширины столбца равной нулю. Я немного изменил его. Теперь это работает так:

  1. Привяжите видимость заголовка к логическому свойству 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"
}
person Helge Klein    schedule 02.04.2011

Один из более простых подходов, который по-прежнему использует концепцию установки ширины столбцов на ноль, но не имеет побочных эффектов использования IValueConverter (пользователь может перетаскивать столбец шире), заключается в создании нового метода получения/установки, который возвращает ширину на основе в вашей переменной ColumnIsVisible, а затем привяжите к ней:

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

    set
    {
        OnPropertyChanged("ColumnWidth");
    }
}

Сделайте свои привязки двусторонними, и если пользователь попытается перетащить столбец шире, будет вызван OnPropertyChanged и сброшена ширина до 0. Возможно, вам придется использовать прокси-сервер привязки для вашей привязки. Также добавьте вызов OnPropertyChanged("ColumnWidth") при обновлении ColumnIsVisible :)

person stuicidle    schedule 30.05.2018

Я установил столбец width="0". Теперь столбец выглядит так, будто его не видно. Но я не знаю, повлияет ли это на что-то еще. Это может быть фиктивным решением, но пока оно работает.

person hyphestos    schedule 17.12.2014
comment
Пользователь по-прежнему может перетаскивать ширину столбца - person paparazzo; 08.06.2015

Используйте, если Thumb.DragDelta может решить проблему

Я использую его в списке как

<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;   
 }
}
}
person Sauron    schedule 08.09.2009