WPF DataGrid: Привязка видимости DataGridColumn к ContextMenu MenuItems IsChecked (MVVM)

Обычно A | B правильный способ сделать это. Но символ вертикальной черты является в основном объединением двух полных выражений XPath. Это может быть раздражающим для использования его в случае как это:

/red/yellow/blue/green/gold | red/orange/blue/green/gold

, так как Вы повторяете полноту выражения за исключением одной маленькой части, он - то изменение.

В случаях как это, часто имеет смысл использовать предикат и эти name() функция вместо этого:

/red/*[name() = 'yellow' or name()='orange']/blue/green/gold

Эта техника предоставляет Вам доступ к намного более широкому диапазону логических операций. Это также (очевидно) быстрее, поскольку навигатор XPath только должен пересечь узлы, это тестирует однажды.

8
задан Phil 30 May 2012 в 17:08
поделиться

3 ответа

Я пытался настроить это для привязки к ContextMenu с помощью 'ElementName', но в конце концов заставил его работать, используя свойства в виртуальной машине, например

bool _isHidden;
public bool IsHidden
{
  get { return _isHidden; }
  set
  {
    if (value != _isHidden)
    {
      _isHidden = value;
      RaisePropertyChanged("IsHidden");
      RaisePropertyChanged("IsVisible");
    }
  }
}

public Visibility IsVisible
{
  get { return IsHidden ? Visibility.Hidden : Visibility.Visible; }
}

и в XAML:

<Window.ContextMenu>
  <ContextMenu>
    <MenuItem Header="Hidden" IsCheckable="True" IsChecked="{Binding IsHidden}" />
  </ContextMenu>
</Window.ContextMenu>

<toolkit:DataGrid x:Name="MyGrid" AutoGenerateColumns="False" ItemsSource="{Binding MyCollection, Mode=Default}" EnableColumnVirtualization="True" IsReadOnly="True" ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}">
  <toolkit:DataGrid.Columns>
    <toolkit:DataGridTextColumn Binding="{Binding Path=MyEntry}" Header="MyEntry" Visibility="{Binding Path=IsVisible, Mode=OneWay}" />
  </toolkit:DataGrid.Columns>
</toolkit:DataGrid>
-1
ответ дан 5 December 2019 в 04:55
поделиться

Хорошо, это было отличным упражнением для WPF n00b.

IanR благодарит за предложение. Я использовал аналогичный подход, но он не поможет вам полностью.

Вот что я придумал, если кто-нибудь сможет найти более последовательный способ сделать это, я буду признателен за любые комментарии:

Препятствия:

  1. DataGridColumnHeader не поддерживает контекстное меню. Поэтому контекстное меню необходимо применять как стиль.

  2. Контекстное меню имеет свой собственный текст данных, поэтому мы должны использовать findancestor, чтобы связать его с контекстом данных ViewModels.

  3. ATM элемент управления DataGrid не анализирует свой контекст данных по своим столбцам . Эту проблему можно решить в программном обеспечении, однако мы используем шаблон MVVM, поэтому я решил следовать подходу jamiers

Решение:

Поместите следующие два блока кода в Window.

1
ответ дан 5 December 2019 в 04:55
поделиться

Вместо booleanToVisibilityConverter можно использовать x:static

<Setter TargetName="UIElement"  Property="UIElement.Visibility" Value="x:Static Visibility.Hidden" />

Статика в XAML: http://msdn.microsoft.com/en-us/library/ms742135.aspx

0
ответ дан 5 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: