My DataGrid
には表示する列の既定の列がありますが、アプリケーションに表示される列を選択/選択解除することもできます。 WPFでそれを行う比較的簡単な方法はありますか?ユーザーがWPF DataGridに表示する列を選択させます
DataGrid
は、DataTable
に結合しています。
注:上記の機能が複雑すぎる場合は、単純な「既定の列/すべての列」をRadioButton
解決策にするだけでよいでしょう。
My DataGrid
には表示する列の既定の列がありますが、アプリケーションに表示される列を選択/選択解除することもできます。 WPFでそれを行う比較的簡単な方法はありますか?ユーザーがWPF DataGridに表示する列を選択させます
DataGrid
は、DataTable
に結合しています。
注:上記の機能が複雑すぎる場合は、単純な「既定の列/すべての列」をRadioButton
解決策にするだけでよいでしょう。
短い答えは、あなたが(チェックボックスまたは他の機構を介して)を設定することができますブールフラグに各列のVisibility
プロパティをバインドし、は崩壊列の可視性を作るためにBooleanToVisibilityConverterを使用していますフラグがセットされていないとき。
これを掘るsimilar question、特にthis answer!彼のブログ記事は、私の理想的な解決策を挙げています。 :)
バインドItemsControl
からDataGrid.Columns
可視-切り替えるためCheckBox
が含まDataTemplate
、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、H.B @。それは私の答えで書いても大したことではありません。 :) –
私は間違いなくこれにあまりにも多くの時間を投資する...あなたを呪うスタックオーバーフロー! –