每次打开ContextMenu时如何强制进行绑定评估?

时间:2009-07-28 08:15:51

标签: wpf data-binding contextmenu

我有一个带有MenuItem的ContextMenu:

<Grid>
    <Button Content="{Binding Test}">
        <Button.ContextMenu>
            <ContextMenu>
                <StackPanel>
                    <MenuItem Header="{Binding Test}"/>
                </StackPanel>
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
</Grid>

Test属性如下所示:

private Random rand;

public string Test
{
    get
    {
        return "Test " + this.rand.Next(50);
    }
}

当我右键单击按钮时,我有,例如“测试41”。下次我打开菜单我有相同的价值。有没有办法强制菜单每次评估绑定? (然后进行“测试3”,“测试45”,“测试65”......

2 个答案:

答案 0 :(得分:1)

这是我在相同情况下使用的黑客:

命名您的上下文菜单并创建自己的RoutedCommand,我将它们用于所有按钮和菜单,因为它们具有启用或禁用控件的CanExecute方法以及被调用以执行工作的Execute方法。每次上下文菜单打开时,都会调用CanExecute方法。这意味着您可以进行自定义处理以查看是否应该启用它,或者您可以更改菜单的内容,以便在保存不同的内容时更改菜单。我们用它来说,当用户编辑xyx时保存xyx ..

无论如何,如果菜单已命名,您可以在CanExecute上修改其内容。 (如果命令源自菜单,你将把它作为事件CanExecute的发送者,但有时我喜欢将它们放在更高的范围内,因为你可以为它们分配键盘快捷键,可以从它们作用域的任何地方执行。)

答案 1 :(得分:0)

您的Test属性需要在其值发生变化时通知其他组件,例如通过在包含类中实现INotifyPropertyChanged接口,如下所示:

class Window1 : Window, INotifyPropertyChanged {

  ...

  private string m_Test;

  public string Test {
    get {
      return m_Test;
    }
    set {
      m_Test = value;
      OnPropertyChanged("Test");
    }
  }

}

然后,您可以使用(Test从任意位置修改Test = "newValue";的值,更改将反映在用户界面上。

如果您确实需要在显示ContextMenu时更改属性的值,请使用Opend的{​​{1}}事件:

的Xaml:

ContextMenu

代码隐藏:

<ContextMenu Opened="UpdateTest">
  <MenuItem Header="{Binding Test}" />
</ContextMenu>