2009-09-08 3 views
12

Кто-нибудь знает, если есть возможность скрыть GridViewColumn как-то вроде этого:C#/WPF: Сделать GridViewColumn Visible = false?

<ListView.View> 
    <GridView> 
     <GridViewColumn Header="Test" IsVisible="{Binding Path=ColumnIsVisible}" /> 
    </GridView> 
<ListView.View> 

Спасибо большое!

Edit: Для ясности

К сожалению, нет "IsVisible" недвижимости. Я ищу способ создать это.

Edit: Решение на основе обратной связи выглядит следующим образом:

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

Спасибо всем!
Cheers

ответ

7

Редактировать: Отражение измененного вопроса.

Как насчет создания столбца ширины 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> 
+0

Спасибо за быстрый ответ. К сожалению, нет свойства IsVisible .. поэтому я ищу способ создать это. –

+0

Комментарий к редактированию: это позволит пользователю изменять размер столбца, к сожалению, также нет свойства Enabled. –

+0

Черт!Я пытаюсь :-) –

-1

использования, если 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; 
} 
} 
} 
7

Here другое решение на основе установки ширина столбца равна нулю. Я немного изменил его. Он теперь работает так:

  1. Bind видимость заголовок к булеву свойству 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" 
} 
+0

это хорошо работает! –

0

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

+2

Пользователь по-прежнему может перетаскивать ширину столбца – Paparazzi