XAML 如何设置按钮的DataContext.ContextMenu与按钮相同?

1bqhqjot  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(132)
<Button Content="{Binding Type}" Name="Ellipsis" Tag="{Binding ElementName=Ellipsis, Path=DataContext}">
    <Button.ContextMenu>
          <ContextMenu x:Name="MainContextMenu" DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
              <MenuItem Header="{Binding Type}"/>
          </ContextMenu>
    </Button.ContextMenu>
    <Button.Triggers>
          <EventTrigger SourceName="Ellipsis" RoutedEvent="Button.Click">
              <BeginStoryboard>
                  <Storyboard>
                      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MainContextMenu" Storyboard.TargetProperty="(ContextMenu.IsOpen)">
                         <DiscreteObjectKeyFrame KeyTime="0:0:0">
                             <DiscreteObjectKeyFrame.Value>
                                 <sys:Boolean>True</sys:Boolean>
                             </DiscreteObjectKeyFrame.Value>
                         </DiscreteObjectKeyFrame>
                      </ObjectAnimationUsingKeyFrames>
                  </Storyboard>
              </BeginStoryboard>
          </EventTrigger>
     </Button.Triggers>
</Button>

如上所示,**Button.Content="{Binding Type}"工作正常,但当它进入上下文菜单时,DataContext发生更改,导致MenuItem Header="{Binding Type}"**不起作用。我在网上进行了调查,有人建议将外部DataContext保存在标记中,并将其用作内部DataContext。我在代码中尝试过,但ContextMenu仍然无法阅读正确的DataContext。菜单项标题应该与按钮相同。在这种情况下,内容却不是。我该怎么办?

pb3skfrl

pb3skfrl1#

回答问题的数据上下文部分。
一种方法是确保你的contextmenu和一个按钮有相同的datacontext,将contextmenu定义为一个资源。

<Grid.Resources>
     <ContextMenu x:Key="MainContextMenu">
          <MenuItem Header="{Binding Type}"/>
      </ContextMenu>
</Grid.Resources>
<Button ContextMenu="{StaticResource MainContextMenu}"

因为contextmenu是在网格中示例化的,所以它继承了网格的datacontext。
如果没有代码,左键将无法工作,而不是使用按钮。
不知道为什么你想左击显示一个上下文菜单,但也许你可以考虑一个弹出而不是上下文菜单。
你可以用一个布尔动画来制作isopen的动画

<BooleanAnimationUsingKeyFrames Storyboard.TargetName="MyPopup" Storyboard.TargetProperty="(Popup.IsOpen)">
              <DiscreteBooleanKeyFrame Value="True" />
            </BooleanAnimationUsingKeyFrames>

或者你可以使用一个带有ischecked布尔值的togglebutton:

<ToggleButton Content="{Binding Type}" 
                      x:Name="Ellipsis" />
        <Popup IsOpen="{Binding IsChecked, ElementName=Ellipsis, Mode=TwoWay}" 
               PlacementTarget="{Binding ElementName=Ellipsis}"
               DataContext="{Binding DataContext, ElementName=Ellipsis}" 
               StaysOpen="False">
            <ListBox>
                <MenuItem Header="{Binding Type}"/>
            </ListBox>
        </Popup>

好的,可能需要更多的工作,但我的弹出窗口显示,并具有正确的datacontext:

相关问题