2011-01-12 11 views
3

My DataGridには表示する列の既定の列がありますが、アプリケーションに表示される列を選択/選択解除することもできます。 WPFでそれを行う比較的簡単な方法はありますか?ユーザーがWPF DataGridに表示する列を選択させます

DataGridは、DataTableに結合しています。

注:上記の機能が複雑すぎる場合は、単純な「既定の列/すべての列」をRadioButton解決策にするだけでよいでしょう。

答えて

6

短い答えは、あなたが(チェックボックスまたは他の機構を介して)を設定することができますブールフラグに各列のVisibilityプロパティをバインドし、崩壊列の可視性を作るためにBooleanToVisibilityConverterを使用していますフラグがセットされていないとき。

これを掘るsimilar question、特にthis answer!彼のブログ記事は、私の理想的な解決策を挙げています。 :)

5

バインドItemsControlからDataGrid.Columns可視-切り替えるためCheckBoxが含まDataTemplateVisbilityToBoolConverterを除いて不要コードで:

<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 @。それは私の答えで書いても大したことではありません。 :) –

+1

私は間違いなくこれにあまりにも多くの時間を投資する...あなたを呪うスタックオーバーフロー! –

関連する問題