C# ContextMenuService.Placement不';不能在MVVM模式的setter中工作

C# ContextMenuService.Placement不';不能在MVVM模式的setter中工作,c#,wpf,button,mvvm,contextmenu,C#,Wpf,Button,Mvvm,Contextmenu,我已经讨论了前面的一些类似问题,但在ContextMenuService.Placement方面仍然存在问题。请建议 当我采用这种方法时,效果很好 <Button x:Name="btn" Content="button" Click="b_Click" > <Button.ContextMenu > <ContextMenu > <MenuItem Header="Open"

我已经讨论了前面的一些类似问题,但在ContextMenuService.Placement方面仍然存在问题。请建议

当我采用这种方法时,效果很好

<Button x:Name="btn" Content="button"  Click="b_Click" >
        <Button.ContextMenu >
            <ContextMenu   >
                <MenuItem Header="Open" Command="{Binding OnOpen}" ></MenuItem>
                <MenuItem Header="Close" Command="{Binding OnClose}"></MenuItem>                    
            </ContextMenu>
        </Button.ContextMenu>
    </Button>

    private void be_Click(object sender, RoutedEventArgs e)
            {
            btn.ContextMenu.PlacementTarget = btn;//Like this
            btn.ContextMenu.Placement = PlacementMode.Top;//Like this
            btn.ContextMenu.DataContext = btn.DataContext;
            btn.ContextMenu.IsOpen = true;            
            }

私有void被单击(对象发送者,路由目标)
{
btn.ContextMenu.PlacementTarget=btn;//像这样
btn.ContextMenu.Placement=PlacementMode.Top;//像这样
btn.ContextMenu.DataContext=btn.DataContext;
btn.ContextMenu.IsOpen=true;
}
但它不适用于MVVM模式

<Button x:Name="btn" VerticalAlignment="Bottom" ContextMenuService.IsEnabled="False">
    <Button.Style>
        <Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsEnabled">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu Name="AddReportContextMenu" HorizontalAlignment="Right">
                         <MenuItem Header="Open" Command="{Binding OnOpen}" ></MenuItem>
                <MenuItem Header="Close" Command="{Binding OnClose}"></MenuItem>                    
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
    </Button>

我试着像这样在setter中添加它

<Setter Property="ContextMenu.PlacementTarget" Value="{Binding ElementName=btn}"></Setter>
<Setter Property="ContextMenu.Placement" Value="Top"></Setter>

或者像这样:

<Setter Property="ContextMenuService.Placement" Value="Top"></Setter>

如果ContextMenuService.IsEnabled未将其设置为false,则placement属性与如下的右键单击配合良好。我必须将其设置为false,以确保ContextMenu仅在左键单击时工作

<Button x:Name="btn" ContextMenuService.Placement="Top">


谢谢大家!

一种可能的解释是,如果上下文菜单太大,无法放在
按钮上方,那么它将显示在其他地方。你想过这个吗?谢谢迈克的回复。上下文菜单不是很大,它只包含两个按钮。当在代码隐藏逻辑中赋值时,它似乎也可以很好地工作,但在xaml中似乎无法使用setter属性。