2011-01-12 109 views
3

我的DataGrid有一组默认的列显示,但我也想让用户选择/取消选择在他们的应用程序上显示的列。在WPF中有相对简单的方法吗?让用户选择在WPF DataGrid上显示哪些列

DataGrid绑定到DataTable

注意:如果上述功能过于复杂,我可以通过RadioButton解决方案简单地使用“Default Columns/All Columns”。

回答

6

简单的答案是,每列的Visibility属性绑定到你能设定(通过复选框或其他机制)一个布尔标志,并使用BooleanToVisibilityConverter使列知名度折叠当标志未被设置时。

挖这个similar question,特别是this answer!他的博客文章列出了我的理想解决方案。 :)

5

绑定DataGrid.ColumnsItemsControlDataTemplate包含了知名度,拨动一个CheckBox,要求除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> 

注:我有一个TextBlock其假设列标题是一个字符串,可能需要调整,如果不是这样的话。


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的努力,@ H.B。这是我在回答中没有写的很多代码。 :) – 2011-01-12 18:06:02