强制上下文菜单在每次打开时重新创建子控件

4
我有一个上下文菜单,其中包含一个OneTime单向绑定和一个第二个非OneTime双向绑定到同一属性。目标是拥有一个颜色编辑器,它显示初始颜色值,并允许用户更改所选值,同时仍能将其与原始值进行比较。
第一次打开上下文菜单时,这很有效,但是每次打开菜单时,菜单似乎并没有完全重新创建自己(缓存?)。相反,它“记住”原始绑定值,而不是从源执行另一个OneTime绑定以获取新的“初始”值。
有没有办法强制上下文菜单在每次打开时完全重新创建其内容?
1个回答

10

通过为ContextMenu创建一个Style并将其DataContext设置为null,当它隐藏时,我能够快速完成此操作。这将导致Binding在打开时重新运行,因为它们将有一个新的源。如果您明确为ContextMenu设置DataContext,则必须将其移动到Setter中:

<ContextMenu>
    <ContextMenu.Style>
        <Style TargetType="{x:Type ContextMenu}">
            <Style.Triggers>
                <Trigger Property="IsOpen" Value="False">
                    <Setter Property="DataContext" Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ContextMenu.Style>
    <MenuItem Header="{Binding Color, Mode=OneTime}" />
</ContextMenu>

1
这个方法效果不错,我喜欢这种方式而不是通过桥接暴露DataContext。但是,由于将数据上下文设置为null会导致小而缩小的上下文菜单闪烁,我将属性更改为IsVisible而不是IsOpen。 - David L
2
我不得不使用IsVisible而不是IsOpen,因为我映射到菜单项的命令没有触发。现在一切看起来都很好,我正在使用IsVisible来触发。 - Rob
谢谢@Rob,IsVisible对我也起作用了,而IsOpen没有。 - Otto Abnormalverbraucher
在树形视图中,如果我反复右键单击不同的树形视图项,则会出现多个菜单项。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接