[英]Placing a context menu on the last Data Column of Data Grid to control the visibility of other columns in WPF
如何將上下文菜單放置在DataGrid的最后一個數據列上,以便它可以控制其他列的可見性。
我有一個總共8列的數據網格。 如何將上下文菜單放在最后一列? 是否需要從上下文菜單中了解是否有可能控制其他列的可見性(如下圖所示)?
<DataGrid x:Name="MyGrid" ItemsSource="{Binding obvCollection}" AutoGenerateColumns="False" >
<DataGridTemplateColumn Header = "Column 1"/>
<DataGridTemplateColumn Header = "Column 2"/>
<DataGridTemplateColumn Header = "Column 3"/>
<DataGridTemplateColumn Header = "Column 4"/>
<DataGridTemplateColumn Header = "Column 5"/>
<DataGridTemplateColumn Header = "Column 6"/>
<DataGridTemplateColumn Header = "Column 7"/>
<DataGridTemplateColumn Header = "Column 8"/>
<DataGridTemplateColumn Header = ""/>
</Datagrid>
您可以使用轉換器來實現:
class VisibilityToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Visibility visibility = (Visibility)value;
return visibility == Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool b = (bool)value;
return b ? Visibility.Visible : Visibility.Hidden;
}
}
...以及一些XAML標記:
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<Grid Background="Gray" Width="25" Height="25"
Tag="{Binding Columns, ElementName=MyGrid}">
<Grid.ContextMenu>
<ContextMenu ItemsSource="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
<ContextMenu.ItemTemplate>
<DataTemplate>
<CheckBox x:Name="chk">
<CheckBox.IsChecked>
<Binding Path="Visibility">
<Binding.Converter>
<local:VisibilityToBooleanConverter />
</Binding.Converter>
</Binding>
</CheckBox.IsChecked>
<CheckBox.Content>
<TextBlock Text="{Binding Header}" />
</CheckBox.Content>
</CheckBox>
<DataTemplate.Triggers>
<!-- hide the last column in the ContentMenu-->
<DataTrigger Binding="{Binding DisplayIndex}" Value="5">
<Setter TargetName="chk" Property="Visibility" Value="Collapsed" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</DataGridTemplateColumn.Header>
</DataGridTemplateColumn>
將示例標記中的Grid
替換為漢堡包按鈕或您希望用戶單擊以調出ContextMenu
任何元素。
您可以按照以下方式使用:
<Expander Grid.Column="0" ExpandDirection="Right" Width="auto" IsExpanded="false" Header="Options" Background="#ececec" Padding="5">
<StackPanel>
<Label Content="Columns:" FontWeight="SemiBold" />
<ItemsControl ItemsSource="{Binding ElementName=DataGridName, Path=Columns}" Grid.IsSharedSizeScope="True" Margin="5">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="A"/>
<ColumnDefinition SharedSizeGroup="B"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Header}" Margin="20, 5, 5, 0"/>
<CheckBox Grid.Column="1" IsChecked="{Binding Visibility, Converter=cnv:CustomVisibilityToBool CollapsedValue=False, VisibleValue=True}}"
Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Expander>
轉換器:
class CustomVisibilityToBool : MarkupExtension, IValueConverter
{
public bool VisibleValue { get; set; }
public bool CollapsedValue { get; set; }
public bool HiddenValue { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((value as Visibility?) == Visibility.Visible) return VisibleValue;
else if ((value as Visibility?) == Visibility.Hidden) return HiddenValue;
else if ((value as Visibility?) == Visibility.Collapsed) return CollapsedValue;
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((value as bool?) == VisibleValue) return Visibility.Visible;
else if ((value as bool?) == HiddenValue) return Visibility.Hidden;
else if ((value as bool?) == CollapsedValue) return Visibility.Collapsed;
return Binding.DoNothing;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.