4

我有一个带有 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);
    }
}

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

4

2 回答 2

1

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

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

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

于 2009-08-06T11:24:58.593 回答
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从任何地方修改 的值,并且更改将反映在 UI 上。Test = "newValue";

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

xml:

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

代码隐藏:

private void UpdateTest(object sender, RoutedEventArgs e) {
  // just assign a new value to the property,
  // UI will be notified automatically
  Test = "Test " + this.rand.Next(50);
}
于 2009-07-28T10:09:42.680 回答