簡體   English   中英

通過 ContextMenu 顯示/隱藏 GridViewColumns

[英]Show/Hide GridViewColumns through ContextMenu

我有一個帶有一些 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 (沒關系,解決方案不需要這個)

問題:

  • 首次顯示 window 時,列 a 和 c 可見
  • 首次顯示 ContextMenu 時,列 a 和 c 被隱藏,僅顯示列 b。 此外,在 ContextMenu 中只檢查了 b 列

有誰知道這是什么原因?


解決方案:

刪除了對 ViewModel 屬性的綁定,並將 MenuItem.IsChecked 設置為默認值。 順便說一句,如果有人有更好的方法來處理這種東西,請告訴我:)

FallbackValue用於綁定無法返回值的情況。 列 b 已檢查且可見,因為您在構造函數中將其設置為 true。 適當地更新您的構造函數。

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

另外,我認為列的可見性會發生變化,因為在右鍵單擊之前可能不會“創建”上下文菜單。 嘗試一個普通的菜單,看看是否有效,是的。

暫無
暫無

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

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