Button的ContextMenu无法继承Button的DataContext该如何解决?
你遇到的问题核心在于ContextMenu并不属于按钮的可视化树,它是独立的弹出元素,常规的DataContext继承或简单绑定会失效。不用绕Tag的弯路,直接给MenuItem的Header做定向绑定就行,这里提供两种靠谱方案:
方案一:通过ContextMenu的PlacementTarget绑定
直接在MenuItem里绑定到按钮的DataContext,ContextMenu的PlacementTarget属性就是触发它的按钮(也就是你的Ellipsis按钮),修改后代码如下:
<Button Content="{Binding Type}" Name="Ellipsis"> <Button.ContextMenu> <ContextMenu x:Name="MainContextMenu"> <!-- 直接绑定到ContextMenu的PlacementTarget(即按钮)的DataContext.Type --> <MenuItem Header="{Binding Path=PlacementTarget.DataContext.Type, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/> </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>
方案二:用x:Reference直接绑定按钮
如果觉得上面的绑定路径太长,也可以用x:Reference直接引用按钮元素,绑定它的DataContext:
<Button Content="{Binding Type}" Name="Ellipsis"> <Button.ContextMenu> <ContextMenu x:Name="MainContextMenu"> <!-- 直接引用按钮Ellipsis的DataContext.Type --> <MenuItem Header="{Binding DataContext.Type, Source={x:Reference Ellipsis}}"/> </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>
原来的Tag方法失效原因
你之前用Tag存储按钮的DataContext再绑定ContextMenu的DataContext,问题出在ContextMenu初始化时还未关联到PlacementTarget,此时PlacementTarget.Tag的绑定无法获取到有效值;即便后续关联,绑定也不会自动触发更新,所以直接在MenuItem上做定向绑定更可靠。
内容的提问来源于stack exchange,提问作者Jtastic
相关产品推荐
相关产品推荐

