Показать / Скрыть GridViewColumns через ContextMenu - PullRequest
2 голосов
/ 11 августа 2011

У меня есть ListView с некоторыми GridViewColumns, и я хотел бы иметь возможность отображать или скрывать их через проверяемые элементы в 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

Кто-нибудь знает, что вызывает это?


Решение:

Удалил привязку к свойствам ViewModel и просто установил для MenuItem.IsChecked значение по умолчанию. Кстати, если у кого-то есть еще лучший способ обработки такого рода вещей, пожалуйста, дайте мне знать:)

1 Ответ

1 голос
/ 11 августа 2011

FallbackValue предназначен для случаев, когда привязка не может вернуть значение. Столбец b отмечен и видим, потому что вы устанавливаете его в true в конструкторе. Обновите ваш конструктор соответствующим образом.

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

Кроме того, я думаю, что видимость столбцов изменяется, потому что контекстное меню, возможно, не «создано» до щелчка правой кнопкой мыши. Попробуйте нормальное меню и посмотрите, работает ли это, да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...