我有以下“样式”(在xaml中定义为资源)。这基本上是一个“DataGridColumnHeaderStyle”,其中一个Menu实现了行过滤。它使用以下命令分配给DataGrid:ColumnHeaderStyle =“{StaticResource lclDataGridColumnHeaders}”
Code Behind中有时需要禁用(行过滤)菜单(menuColumnOptions),该菜单在此样式中定义。任何人都可以告诉我如何访问此元素,以便我可以通过C#更改其可见性?
我试过:myDataGrid.Template.FindName(“menuColumnOptions”)但是我收到了一个错误,关于它的一些东西必须“应用”......
(我想替代解决方案是创建一个没有此菜单的重复“样式”并更改所有列以使用该样式...)
<Style x:Key="lclDataGridColumnHeaders" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Foreground" Value="{StaticResource appTextColor}"/>
<Setter Property="FontWeight" Value="DemiBold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border x:Name="BackgroundBorder"
BorderThickness="0,1,0,1"
Background="{StaticResource lclDataGridHeaderBackground}"
BorderBrush="Transparent"
Grid.ColumnSpan="2" />
<ContentPresenter Margin="6,3,6,3" VerticalAlignment="Center" />
<Path Grid.Column="1" x:Name="SortArrow" Visibility="Collapsed" Data="M0,0 L1,0 0.5,1 z"
Width="8" Height="6" Fill="Gray" Stretch="Fill" Margin="0,0,8,0"
VerticalAlignment="Center" RenderTransformOrigin="0.5,0.4" />
<Menu Grid.Column="3" x:Name="menuColumnOptions" VerticalAlignment="Center" Background="#FFF9F9F7" HorizontalAlignment="Right" >
<MenuItem Padding="0" SubmenuOpened="MenuItemColumnOptions_SubmenuOpened">
<MenuItem.Header>
<Border BorderBrush="{StaticResource appTextColor}" BorderThickness="1" CornerRadius="2" Height="20" Width="20" >
<Path Data="M0,0 L1,0 0.5,1 z" Stretch="Fill" Fill="{StaticResource appTextColor}"
Width="10" Height="8" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.4" Margin="2,0"/>
</Border>
</MenuItem.Header>
<MenuItem x:Name="clearFilterMenuItem" Header="Clear Filter..." Click="ClearFilter_Click" IsEnabled="False">
<MenuItem.Icon>
<Image Source="/IngramBook.WpfTableEditor;component/Images/edit_undohs.png" Width="16" Height="16"/>
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem Header="Equals..." Click="CustomAutoFilter_Click" />
<MenuItem Header="Does Not Equal..." Click="CustomAutoFilter_Click"/>
<Separator />
<MenuItem Header="Begins With..." Click="CustomAutoFilter_Click"/>
<MenuItem Header="Ends With..." Click="CustomAutoFilter_Click"/>
<Separator />
<MenuItem Header="Contains..." Click="CustomAutoFilter_Click" />
<MenuItem Header="Does Not Contain..." Click="CustomAutoFilter_Click"/>
<Separator />
<MenuItem Header="Custom Filter..." Click="CustomAutoFilter_Click">
<MenuItem.Icon>
<Image Source="/IngramBook.WpfTableEditor;component/Images/Filter2HS.png" Width="16" Height="16"/>
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem Header="Select Individual Values..." Click="SelectIndividualItems_Click">
<MenuItem.Icon>
<Image Source="/IngramBook.WpfTableEditor;component/Images/checkboxhs.png" Width="16" Height="16"/>
</MenuItem.Icon>
</MenuItem>
<Separator />
<MenuItem Header="Trim Trailing White Spaces..." Click="TrimTrailingWhiteSpaces_Click"/>
<MenuItem Header="Capitalization" >
<MenuItem.Icon>
<Image Source="/IngramBook.WpfTableEditor;component/Images/FontHS.png" Width="16" Height="16"/>
</MenuItem.Icon>
<MenuItem Header="Capitalize Each Word" Click="CapitalizeEachWord_Click"/>
<MenuItem Header="UPPERCASE" Click="Uppercase_Click"/>
<MenuItem Header="lowercase" Click="Lowercase_Click"/>
</MenuItem>
<Separator />
<MenuItem Header="Hide Column" Click="HideColumn_Click"/>
<Separator />
<MenuItem x:Name="deleteColumnMenuItem" Header="Delete Column" Click="dropColumnButton_Click">
<MenuItem.Icon>
<Image Source="/IngramBook.WpfTableEditor;component/Images/DeleteHS.png" Width="16" Height="16"/>
</MenuItem.Icon>
</MenuItem>
</MenuItem>
</Menu>
<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="SortDirection" Value="Ascending">
<Setter TargetName="SortArrow" Property="Visibility" Value="Visible" />
<Setter TargetName="SortArrow" Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="180" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="SortDirection" Value="Descending">
<Setter TargetName="SortArrow" Property="Visibility" Value="Visible" />
</Trigger>
<Trigger Property="SortDirection" Value="{x:Null}">
<Setter TargetName="SortArrow" Property="Visibility" Value="Collapsed" />
</Trigger>
<Trigger Property="DisplayIndex" Value="0">
<Setter Property="Visibility" Value="Collapsed" TargetName="PART_LeftHeaderGripper" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True" >
<Setter Property="Background" TargetName="BackgroundBorder" Value="{StaticResource appButtonBackgroundHighlight}" />
<Setter Property="BorderBrush" TargetName="BackgroundBorder" Value="Transparent" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
答案 0 :(得分:0)
您是否可以为DataGridColumnHeader类创建附加属性(属性bobe或可见性),并将Menu的Enabled或Visibility属性绑定到该附加属性?
http://www.deepcode.co.uk/2008/08/exposing-new-properties-for-control_15.html
Menu myMenu = (Menu)this.myDataGrid.Template.FindName("menuColumnOptions", this.myDataGrid);
menu.Visibility = System.Windows.Visibility.Hidden;
如果您收到错误,是否可以在代码中显示设置代码可见性的代码?听起来您可能在完全构造之前尝试访问DataGridColumnHeader的模板(在这种情况下,将代码移动到Loaded事件可能会解决您的问题)。
<Window x:Class="TestApp11.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:TestApp11"
xmlns:s="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="500" Width="800">
<Grid>
<Grid.Resources>
<Style x:Key="MyButtonStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="Red" BorderThickness="2">
<StackPanel>
<TextBlock x:Name="MyTextBlock" Text="Control Template's TextBlock 1" />
<ContentPresenter />
<TextBlock Text="Control Template's TextBlock 2" />
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button x:Name="scottsButton" Style="{StaticResource MyButtonStyle}">
<TextBlock Text="This Text should appear where the Control Template's ContentPresenter is located."/>
</Button>
<Button Grid.Row="1" Content="Click to hide visibility of TextBlock1" Click="Button_Click" />
</Grid>
</Window>
代码背后:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
TextBlock tb = (TextBlock)this.scottsButton.Template.FindName("MyTextBlock", this.scottsButton);
tb.Visibility = System.Windows.Visibility.Hidden;
}
}
答案 1 :(得分:0)
这是我最终做的事情。
我复制了样式并从此副本中删除了菜单。
然后,在代码中我只是使用:
设置它myDataGrid.ColumnHeaderStyle =(Style)FindResource(“lclDataGridLockedColumnHeaders”);