簡體   English   中英

在數據網格的最后一個數據列上放置一個上下文菜單,以控制WPF中其他列的可見性

[英]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;
    }
}

如果您將其放置在DataGrid旁邊,它將看起來像: 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM