我有一个带有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”......
答案 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>