我的DataGrid
有一组默认的列显示,但我也想让用户选择/取消选择在他们的应用程序上显示的列。在WPF中有相对简单的方法吗?让用户选择在WPF DataGrid上显示哪些列
DataGrid
绑定到DataTable
。
注意:如果上述功能过于复杂,我可以通过RadioButton
解决方案简单地使用“Default Columns/All Columns”。
我的DataGrid
有一组默认的列显示,但我也想让用户选择/取消选择在他们的应用程序上显示的列。在WPF中有相对简单的方法吗?让用户选择在WPF DataGrid上显示哪些列
DataGrid
绑定到DataTable
。
注意:如果上述功能过于复杂,我可以通过RadioButton
解决方案简单地使用“Default Columns/All Columns”。
简单的答案是,每列的Visibility
属性绑定到你能设定(通过复选框或其他机制)一个布尔标志,并使用BooleanToVisibilityConverter使列知名度折叠当标志未被设置时。
挖这个similar question,特别是this answer!他的博客文章列出了我的理想解决方案。 :)
绑定DataGrid.Columns
到ItemsControl
与DataTemplate
包含了知名度,拨动一个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的努力,@ H.B。这是我在回答中没有写的很多代码。 :) – 2011-01-12 18:06:02