无法从DataGridColumnHeader样式模板中绑定到DataGrid列

时间:2018-04-12 14:35:31

标签: wpf mvvm

我正在使用自定义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下。

有什么想法吗?欢呼声。

1 个答案:

答案 0 :(得分:1)

DataGrid不是ContextMenu的视觉祖先。

您可以将Tag的{​​{1}}属性绑定到DataGridColumnHeader,然后使用DataGridContextMenu绑定到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