2009-09-08 13 views
12

Weiß jemand, ob es eine Möglichkeit ist, ein irgendwie Gridviewcolumn so zu verstecken: vielC#/WPF: Machen Sie eine GridViewColumn sichtbar = false?

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

Dank!

Edit: Aus Gründen der Klarheit

Leider gibt es kein "IsVisible" Eigentum. Ich suche nach einer Möglichkeit, das zu schaffen.

Edit: Die Lösung auf dem Feedback basiert wie folgt aussieht:

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

Danke an alle!
Cheers

Antwort

7

Bearbeiten: Reflektieren der modifizierten Frage.

Wie wäre es mit einer Spalte mit 0 Breite? Schreibe einen Booleschen Wert in Width IValueConverter, der eine ColumnIsVisible als ConverterParmeter akzeptiert?

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

Etwas wie:

<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

Danke für die schnelle Antwort. Leider gibt es keine "IsVisible" -Eigenschaft. Also suche ich nach einer Möglichkeit, das zu erstellen. –

+0

Kommentar zu Ihrer Bearbeitung: Das würde dem Benutzer immer erlauben, die Größe der Spalte zu ändern, leider gibt es auch keine Enabled-Eigenschaft. –

+0

Verdammt!Ich versuche :-) –

-1

Verwenden wenn Thumb.DragDelta das Problem

lösen kann ich es in Listenansicht verwenden, wie

<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 ist eine andere Lösung basiert auf Einstellung die Spaltenbreite auf Null. Ich habe es ein wenig modifiziert. Es funktioniert nun wie folgt aus:

  1. Bind die Sichtbarkeit des Headers auf eine boolean-Eigenschaft des Ansichtsmodell, eine Bool-to-Sichtbarkeit Konverter
  2. Verwenden Sie eine angefügte Eigenschaft in der Kopfzeile mit der Spalte zu setzen Breite auf Null

Hier ist der Code.

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

Befestigt Verhalten 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

das funktioniert gut! –

0

ich die Spalte die Breite = "0" auf Null gesetzt haben. Jetzt sieht die Spalte wie seine nicht sichtbar aus. Aber ich weiß nicht, ob es irgendetwas anderes betrifft. Es könnte eine Dummy-Lösung sein, aber für den Moment funktioniert es.

+2

Der Benutzer kann weiterhin die Spaltenbreite ziehen – Paparazzi

Verwandte Themen