【问题标题】:Show/Hide GridViewColumns through ContextMenu通过 ContextMenu 显示/隐藏 GridViewColumns
【发布时间】:2011-08-10 22:05:39
【问题描述】:

我有一个带有一些 GridViewColumns 的 ListView,我希望能够通过 ContextMenu 中的可检查项目来显示或隐藏它们。

MainView.xaml:

<ListView>
  <ListView.ContextMenu>
    <ContextMenu>
      <MenuItem x:Name="cma" Header="a" IsCheckable="True" IsChecked="True"/>
      <MenuItem x:Name="cmb" Header="b" IsCheckable="True"/>
      <MenuItem x:Name="cmc" Header="c" IsCheckable="True" IsChecked="True"/>
      <MenuItem x:Name="cmd" Header="d" IsCheckable="True"/>
    </ContextMenu>
  </ListView.ContextMenu>
  <ListView.View>
    <GridView>
      <c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cma, Path=IsChecked}">
        <GridViewColumnHeader Content="a"/>
      </c:GridViewColumnExt>
      <c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cmb, Path=IsChecked}">
        <GridViewColumnHeader Content="b"/>
      </c:GridViewColumnExt>
      <c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cmc, Path=IsChecked}">
        <GridViewColumnHeader Content="c"/>
      </c:GridViewColumnExt>
      <c:GridViewColumnExt c:GridViewColumnExt.IsVisible="{Binding ElementName=cmd, Path=IsChecked}">
        <GridViewColumnHeader Content="d"/>
      </c:GridViewColumnExt>
    </GridView>
  </ListView.View>
</ListView>

GridViewColumnExt.cs:

public class GridViewColumnExt : GridViewColumn
{
  private double _visibleWidth = double.NaN;

  public bool IsVisible
  {
    get { return (bool)GetValue(IsVisibleProperty); }
    set { SetValue(IsVisibleProperty, value); }
  }

  public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.Register("IsVisible", typeof(bool), typeof(GridViewColumnExt), new FrameworkPropertyMetadata(true, OnIsVisibleChanged));

  private static void OnIsVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
    var newValue = bool.Parse(e.NewValue.ToString());
    var column = (GridViewColumnExt)d;
    var header = (GridViewColumnHeader)column.Header;
    header.IsEnabled = newValue;
    if (newValue)
    {
      column.Width = column._visibleWidth;
      header.IsEnabled = true;
      header.Visibility = Visibility.Visible;
    }
    else
    {
      column._visibleWidth = column.Width;
      column.Width = 0;
      header.IsEnabled = false;
      header.Visibility = Visibility.Collapsed;
    }
  }
}

MainViewModel.cs(没关系,解决方案不需要这个)

问题:

  • 当窗口首次显示时,列 a 和 c 可见
  • 首次显示 ContextMenu 时,a 和 c 列被隐藏,只显示 b 列。此外,在 ContextMenu 中仅检查 b 列

有人知道这是什么原因吗?


解决方案:

删除了与 ViewModel 属性的绑定,并将 MenuItem.IsChecked 设置为默认值。 顺便说一句,如果有人有更好的方法来处理这种事情,请告诉我:)

【问题讨论】:

  • OnIsVisibleChanged 中的代码难以阅读,请拼出正确的名称而不是单字母变量。
  • 我想你是对的,我只是想在我的例子中我想要更少的文字。现在修复它,只为你:)
  • 如果您为自己绘制一些稍后将被丢弃的东西,那么更少的代码是可以的,当其他人需要阅读并且应该理解它/如果有问题时,请不要这样做用它(即,如果你把它贴在这里)。

标签: c# wpf gridview contextmenu dependency-properties


【解决方案1】:

FallbackValue 用于绑定无法返回值的情况。列 b 已检查且可见,因为您在构造函数中将其设置为 true。适当地更新你的构造函数。

public class MainViewModel
{
  public MainViewModel()
  {
    ColumnChecked_a = true;
    ColumnChecked_b = true;
    ColumnChecked_c = true;
  }
}

另外,我认为列的可见性会发生变化,因为在右键单击之前可能不会“创建”上下文菜单。试试普通菜单,看看是否可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多