Обычно A | B
правильный способ сделать это. Но символ вертикальной черты является в основном объединением двух полных выражений XPath. Это может быть раздражающим для использования его в случае как это:
/red/yellow/blue/green/gold | red/orange/blue/green/gold
, так как Вы повторяете полноту выражения за исключением одной маленькой части, он - то изменение.
В случаях как это, часто имеет смысл использовать предикат и эти name()
функция вместо этого:
/red/*[name() = 'yellow' or name()='orange']/blue/green/gold
Эта техника предоставляет Вам доступ к намного более широкому диапазону логических операций. Это также (очевидно) быстрее, поскольку навигатор XPath только должен пересечь узлы, это тестирует однажды.
Я пытался настроить это для привязки к 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>
Хорошо, это было отличным упражнением для WPF n00b.
IanR благодарит за предложение. Я использовал аналогичный подход, но он не поможет вам полностью.
Вот что я придумал, если кто-нибудь сможет найти более последовательный способ сделать это, я буду признателен за любые комментарии:
Препятствия:
DataGridColumnHeader не поддерживает контекстное меню. Поэтому контекстное меню необходимо применять как стиль.
Контекстное меню имеет свой собственный текст данных, поэтому мы должны использовать findancestor, чтобы связать его с контекстом данных ViewModels.
ATM элемент управления DataGrid не анализирует свой контекст данных по своим столбцам . Эту проблему можно решить в программном обеспечении, однако мы используем шаблон MVVM, поэтому я решил следовать подходу jamiers
Решение:
Поместите следующие два блока кода в Window.
Вместо booleanToVisibilityConverter можно использовать x:static
<Setter TargetName="UIElement" Property="UIElement.Visibility" Value="x:Static Visibility.Hidden" />
Статика в XAML: http://msdn.microsoft.com/en-us/library/ms742135.aspx