在ContextMenu中,MenuItem的IsChecked绑定不起作用

5

我有一个MVVM应用程序,想要添加一个上下文菜单。

我在XAML中添加了上下文菜单,然后设置了项目(这里只有一个项目因为不重要):

<MenuItem Header="{x:Static Monitor:MonitorResources.R0206_SaveLatestValueToDatabase}"
                                      IsCheckable="true"
                                      IsChecked="{Binding ElementName=root, Path=Model.SaveToDbOneChecked}"
                                      IsEnabled="{Binding ElementName=root, Path=Model.SaveToDbOneEnabled}">

SaveToDbOneChecked和SaveToDbOneEnabled是我的模型中的属性,实现方式如下:

    private bool mSaveToDbOneEnabled;

    public bool SaveToDbOneChecked
    {
        get { return mSaveToDbOneChecked; }
        set { mSaveToDbOneChecked = value; OnPropertyChanged("SaveToDbOneChecked"); }
    }

我在GridView中的SelectionChanged事件被调用之前设置了这些内容,但是即使将SaveToDbOneChecked设置为true,ContextMenu中的MenuItem旁边也不会显示带有检查标志的文本。我不知道我做错了哪里,希望有人能在这里帮助我。


1
在调试模式下运行应用程序,并检查输出窗口中的绑定错误。 - Novitchi S
是的,有相当多:找不到与引用'ElementName=root'绑定的源。BindingExpression:Path=Model.SaveToDbOneChecked; DataItem=null; 目标元素为'MenuItem' (Name=''); 目标属性为'IsEnabled' (类型为'Boolean')。我的绑定出了什么问题?o_O - Flo
1个回答

5
要使此功能正常工作,您需要做一些事情。首先,您不能使用ElementName属性从MenuItem内部绑定,因为目标元素往往超出了您的范围。
如果我理解正确,Model是您的ViewModel属性,在这种情况下,您只需将其设置为放置ContextMenu的元素的DataContext即可。这将为您的MenuItem设置相同的DataContext,并且您可以直接绑定到DataContext
IsChecked="{Binding SaveToDbOneChecked, Mode=TwoWay}"

太棒了!完全可行!非常感谢您,先生!! - Flo

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