2011-01-12 4 views
3

Meine DataGrid verfügt über eine Standardgruppe von Spalten anzuzeigen, aber ich möchte auch den Benutzer aktivieren/deaktivieren Spalten in ihrer Anwendung angezeigt werden. Gibt es einen relativ einfachen Weg, das in WPF zu tun?Lassen Sie Benutzer auswählen, welche Spalten auf WPF DataGrid angezeigt werden

Die DataGrid ist an eine DataTable gebunden.

Hinweis: Ich kann nur mit einem einfachen "Standard Spalten/Alle Spalten" über RadioButton Lösung gehen, wenn die oben genannte Funktion zu kompliziert ist.

Antwort

6

Die kurze Antwort ist, bindet die Visibility Eigenschaft jeden Spalt mit einem boolean-Flag, die Sie (über eine CheckBox oder einen anderen Mechanismus) und ein BooleanToVisibilityConverter verwenden, um festgelegt sind in der Lage die Spalte Sichtbarkeit Komprimiert zu machen wenn die Flagge nicht gesetzt ist.

Dig dies similar question, und vor allem this answer! Sein Blogbeitrag listet auf, was meine ideale Lösung wäre. :)

5

Bind die DataGrid.Columns an ein ItemsControl mit einem DataTemplate die einen CheckBox für Sichtbarkeits-Hin- und Herschalten enthält, benötigt kein Code mit Ausnahme der VisbilityToBoolConverter:

<Window 
    ... 
    DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}" Loaded="Window_Loaded"> 
    <Window.Resources> 
     <local:VisibilityToBoolConverter x:Key="VisibilityToBoolConv"/> 
    </Window.Resources> 
    <StackPanel Orientation="Vertical"> 
     <DataGrid ItemsSource="{Binding Data}" Name="DGrid"/> 
     <ItemsControl ItemsSource="{Binding ElementName=DGrid, Path=Columns}" Grid.IsSharedSizeScope="True" Margin="5"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition SharedSizeGroup="A"/> 
          <ColumnDefinition SharedSizeGroup="B"/> 
         </Grid.ColumnDefinitions> 
         <TextBlock Text="{Binding Header}" Margin="5"/> 
         <CheckBox Grid.Column="1" IsChecked="{Binding Visibility, Converter={StaticResource VisibilityToBoolConv}}" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Grid> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </StackPanel> 
</Window> 

Anmerkung: habe ich eine TextBlock annimmt, die der Column-Header als String, muss möglicherweise angepasst werden, wenn dies nicht der Fall ist.


VisibilityConverter:

[ValueConversion(typeof(Visibility), typeof(bool))] 
public class VisibilityToBoolConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     Visibility vis = (Visibility)value; 
     switch (vis) 
     { 
      case Visibility.Collapsed: 
       return false; 
      case Visibility.Hidden: 
       return false; 
      case Visibility.Visible: 
       return true; 
     } 
     return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if ((bool)value) return Visibility.Visible; 
     else return Visibility.Collapsed; 
    } 

    #endregion 
} 
+1

+1 für Anstrengung, @ H.B. Das ist viel Code, den ich in meiner Antwort nicht geschrieben habe. :) –

+1

ich definitiv investieren zu viel Zeit in diesem ... verfluchen Sie Stack-Überlauf! –