3

我想为我的应用程序中的所有上下文菜单创建一个样式。这种样式将允许我在上下文菜单中添加标题/标题。我现在使用的风格如下

<Style x:Uid="someStyle" TargetType="{x:Type ContextMenu}">
    <Setter x:Uid="Setter_240" Property="Background" Value="{DynamicResource someBrush}" />
    <Setter x:Uid="Setter_241" Property="BorderBrush" Value="{DynamicResource someBorderBrush}" />
    <Setter x:Uid="Setter_242" Property="SnapsToDevicePixels" Value="True" />
    <Setter x:Uid="Setter_243" Property="Template">
        <Setter.Value>
            <ControlTemplate x:Uid="ControlTemplate_30" TargetType="{x:Type ContextMenu}">
                <Grid x:Uid="Grid_27">
                    <Border x:Uid="Border_25" Margin="1" x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" />
                    <StackPanel x:Uid="StackPanel_4" Background="{TemplateBinding Background}" IsItemsHost="True" ClipToBounds="True" Orientation="Vertical" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger x:Uid="Trigger_76" Property="IsEnabled" Value="False">
                        <Setter x:Uid="Setter_244" Property="Background" Value="{DynamicResource someBrush}" TargetName="Border" />
                        <Setter x:Uid="Setter_245" Property="BorderBrush" Value="{DynamicResource someBrush}" TargetName="Border" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这种风格对我来说效果很好,但无法添加标题/标题。我最初的想法是在这里放置一个虚拟标签

<Grid x:Uid="Grid_27">
                <Border x:Uid="Border_25" Margin="1" x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" />
                <Label Content {bind some way to allow the user to set it}>
                    <Label.Triggers>
                        <some way to hide the header if not set/>
                    <Label.Triggers>
                </Label>
                <StackPanel x:Uid="StackPanel_4" Background="{TemplateBinding Background}" IsItemsHost="True" ClipToBounds="True" Orientation="Vertical" />
            </Grid>

我希望我可以将此标签用作所有上下文菜单的可绑定标题/标题。我遇到的问题是我不知道如何使这个标签可绑定,以便每个上下文菜单都可以有不同的标题/标题。该解决方案还必须尽可能自包含。我不想让每个使用过上下文菜单的人都必须添加多行来启用此功能,即我希望标题是可选的,而不是每个菜单上的要求,所以如果有触发器或其他东西会很棒如果未设置,可能会隐藏标题

实现这一目标并使其尽可能可重用的最佳/最干净的方法是什么?

4

1 回答 1

1

在您的风格中,只需滴入绑定:

<Grid x:Uid="Grid_27" DataContext={Binding}>
            <Border .../>
            <Label Content="{Binding MenuTitle}" 
                   Visibility="{Binding IsVisible, Converter={StaticResource BoolToVisibility}}"/>
            ...the rest of your style...
        </Grid>

在使用中,提供数据上下文:

<MenuItem DataContext="{Binding SomeViewModel.Menu1}"
         Style={StaticResource yourstyle}>
  ...

其中 Menu1 是具有“MenuTitle”和“IsVisible”属性的类型的属性

于 2013-05-16T16:56:13.510 回答