我正在使用自定义DataGrid
,并希望能够在我右键单击可以改变列的可见性的列标题时拥有ContextMenu
。我为Style
定义了DataGridColumnHeader
,其中包含一个模板,我尝试定义ContextMenu
,其中DataGrid
的列为ItemsSource
:
<ContextMenu ItemsSource="{Binding Columns, RelativeSource={RelativeSource AncestorType={x:Type customControls:CustomDataGrid}}}">
<ContextMenu.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="IsChecked" Value="{Binding Visibility, Converter={StaticResource BooleanToVisibilityConverter}, Mode = TwoWay}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
但是,当我右键单击列标题以查看ContextMenu
时,没有任何反应(它没有按预期打开),当我在VS中查看Live Property Explorer时,我可以看到{{1 ItemsSource
的属性为空,因此显然找不到ContextMenu
的Columns属性。
请注意,在VS中的实时可视树中,我可以看到为控件定义的DataGrid
样式,该样式位于层次结构中的自定义DataGridColumnHeader
下。
有什么想法吗?欢呼声。
答案 0 :(得分:1)
DataGrid
不是ContextMenu
的视觉祖先。
您可以将Tag
的{{1}}属性绑定到DataGridColumnHeader
,然后使用DataGrid
将ContextMenu
绑定到DataGrid
属性:
PlacementTarget
另请注意,您应使用<Style TargetType="DataGridColumnHeader">
<Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu ItemsSource="{Binding PlacementTarget.Tag.Columns, RelativeSource={RelativeSource Self}}">
<ContextMenu.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="IsCheckable" Value="True" />
<Setter Property="IsChecked" Value="{Binding Visibility, Converter={StaticResource VisibilityToBooleanConverter}}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
而不是VisibilityToBooleanConverter
:
BooleanToVisibilityConverter