C# / WPF: сделать видимым GridViewColumn=false?
кто-нибудь знает, есть ли возможность скрыть GridViewColumn как-то так:
<ListView.View>
    <GridView>
        <GridViewColumn Header="Test" IsVisible="{Binding Path=ColumnIsVisible}" />
    </GridView>
<ListView.View>
Спасибо большое!
Edit: для ясности
к сожалению, нет свойства" 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();
    }
}
спасибо всем!
Ура!--3-->
    
5 ответов
Edit: отражение измененного вопроса.
Как насчет создания столбца ширины 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 boolToVis}, 
                ConverterParameter=ColumnIsVisible}" />
    </GridView>
 <ListView.View>
здесь - это еще одно решение, основанное на установке ширины столбца на ноль. Я немного изменил его. Теперь он работает следующим образом:
- свяжите видимость заголовка с логическим свойством ViewModel, используя конвертер bool-to-visibility
 - используйте вложенное свойство в заголовке, чтобы установить ширину столбца в ноль
 
здесь код.
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"
}
Я установил столбец Width= " 0 " в ноль. Теперь колонна выглядит так, будто ее не видно. Но я не знаю, повлияет ли это на что-нибудь еще. Это может быть фиктивное решение, но пока оно работает.
один более простой подход, который по-прежнему использует концепцию установки ширины столбцов на ноль, но не имеет побочных эффектов использования IValueConverter (пользователь все еще может перетащить столбец шире), чтобы создать новый геттер/сеттер, который возвращает ширину на основе вашего ColumnIsVisible переменной, а затем привязать к этому:
public double ColumnWidth
{
    get
    {
        if (this.ColumnIsVisible)
        {
            return 100;
        }
        else
        {
            return 0;
        }
    }
    set
    {
        OnPropertyChanged("ColumnWidth");
    }
}
Сделайте ваши привязки TwoWay и если пользователь пытается перетащить столбец шире OnPropertyChanged будет вызван и сбросит ширину до 0. Возможно, вам придется использовать прокси-сервер привязки хотя для привязки. Также добавьте вызов OnPropertyChanged("ColumnWidth") когда когда-либо ColumnIsVisible обновляется :)
используйте if 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;   
 }
}
}