C#/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? Напишете 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>
person Preet Sangha    schedule 08.09.2009
comment
Благодаря за бързата реакция. За съжаление няма свойство IsVisible... така че търся начин да го създам. - person Joseph jun. Melettukunnel; 08.09.2009
comment
Коментар към вашата редакция: Това все още ще позволи на потребителя да преоразмерява колоната, за съжаление също няма активирано свойство. - person Joseph jun. Melettukunnel; 08.09.2009
comment
@Joseph: няма свойство IsEnabled в самата GridViewColumn, но има такова в 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, като използвате преобразувател от bool към видимост
  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