代码之家  ›  专栏  ›  技术社区  ›  DotNetSpartan

在数据网格的最后一个数据列上放置上下文菜单,以控制WPF中其他列的可见性。

  •  1
  • DotNetSpartan  · 技术社区  · 7 年前

    如何在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>     
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   mm8    7 年前

    您可以使用转换器实现这一点:

    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 .

        2
  •  1
  •   Alfie JP Alioto    7 年前

    您可以使用以下行中的某些内容:

    <expander grid.column=“0”expanddirection=“right”width=“auto”isexpanded=“false”header=“options”background=“ecececec”padding=“5”>
    <堆叠面板>
    
    <label content=“columns:”fontweight=“semibold”/>
    <itemsControl itemssource=“binding elementname=datagridname,path=columns”grid.issharedSizeScope=“true”margin=“5”>
    <itemscontrol.itemspanel>
    <项模板lt;itemspaneltemplate>
    <stackpanel orientation=“垂直”/>
    </itemspaneltemplate>
    </itemscontrol.itemspanel>
    <itemsControl.itemTemplate>
    <数据模板>
    <网格>
    <grid.columndefinitions>
    <columnDefinition sharedsizeGroup=“A”/>
    <columnDefinition sharedsizeGroup=“b”/>
    </grid.columndefinitions>
    <textBlock text=“绑定头”margin=“20,5,5,0”/>gt;
    <checkbox grid.column=“1”ischecked=“绑定可见性,converter=cnv:customVisibilityToBool collapsedValue=false,visibleValue=true”
    margin=“5”horizontallight=“center”verticalalightment=“center”/>
    和/格栅& GT;
    </datatemplate>
    </itemscontrol.itemstemplate>
    </itemscontrol>
    </stackpanel>
    </expander>
    < /代码> 
    
    

    转换器:

    class customVisibilityToBool:markupExtension,ivalueConverter
    {
    public bool visiblevalue_get;set;
    public bool collapsedvalue get;set;
    public bool hiddenvalue_get;set;
    公共重写对象ProvideValue(IServiceProvider ServiceProvider)
    {
    归还这个;
    }
    公共对象转换(对象值、类型TargetType、对象参数、CultureInfo Culture)
    {
    如果(值作为可见性?)==visibility.visible)返回visibleValue;
    否则,如果(值作为可见性?)==visibility.hidden)返回hiddenvalue;
    否则,如果(值作为可见性?)==visibility.collapsedvalue)返回collapsedvalue;
    
    返回binding.donothing;
    }
    公共对象转换回(对象值、类型TargetType、对象参数、System.Globalization.CultureInfo Culture)
    {
    如果((值为bool?)==visibleValue)返回visibility.visible;
    否则,如果((值为bool?)==hiddenvalue)返回visibility.hidden;
    否则,如果((值为bool?)==collapsedvalue)返回visibility.collapsed;
    
    返回binding.donothing;
    }
    }
    < /代码> 
    
    

    如果将其放在datagrid

    转换器:

    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看起来像: enter image description here

    推荐文章