WPF - MenuItem - 在菜单项上选中/取消选中确认消息

时间:2017-03-28 01:04:51

标签: c# wpf binding menuitem

在WPF中,我有一个绑定到设置的MenuItem,我希望每次用户点击时都会弹出一个消息框。

<MenuItem IsCheckable="True" Header="MyConfig" IsChecked="{Binding Source={x:Static res:Settings.Default}, 
               Path=MyConfigPath, Mode=TwoWay}"/>

最好的方法是什么(如果没有代码可能的话)?

2 个答案:

答案 0 :(得分:1)

假设您绑定的Settings类是一个扩展ApplicationSettingsBase的自动生成的类,您可以将事件处理程序附加到SettingChanging并在该事件处理程序中显示确认对话框,如果用户点击&#34;取消&#34;你需要设置e.Cancel = true

下面是一些伪代码,假设您在第一次显示WPF窗口时将调用WpfInit()

private void WpfInit()
{
    Settings.Default.SettingChanging += Settings_SettingsChanging;
}

private void Settings_SettingsChanging(Object sender, SettingChangingEventArgs e) {
   var dlgResult = MessageBox.Show("Are you sure?", "Please Confirm...", MessageBoxButton.YesNo);
   if (dlgResult != MessageBoxResult.Yes) {
      e.Cancel = true;
      MessageBox.Show("Change cancelled");
   }
}

注意:

  • 当您的WPF表单关闭时,不要忘记解开您的事件处理程序Settings.Default.SettingChanging -= Settings_SettingsChanging;
  • 我觉得这个代码背后的内容会让你对那些碰巧阅读你代码的人的意图最明显。当然,我确信有一种方法可以避免代码落后,但恕我直言,为了避免代码隐藏而避免使用代码并不总是代码可读性的最佳实践。

答案 1 :(得分:1)

  

最好的方法是什么(如果没有代码可能的话)?

那就是将Command的{​​{1}}属性绑定到视图模型的MenuItem属性,然后在ICommand方法中弹出消息框。命令:

Execute
<MenuItem IsCheckable="True" Header="MyConfig" IsChecked="{Binding Source={x:Static res:Settings.Default}, 
           Path=MyConfigPath, Mode=TwoWay}" Command="{Binding YourCommand}"/>

在视图模型中调用阻塞public DelegateCommand<object> YourCommand => new DelegateCommand<object>((arg) => MessageBox.Show("")); 方法虽然不是一个好主意,但那是另一个故事:https://blog.magnusmontin.net/2013/04/20/implement-a-confirmation-dialog-in-wpf-with-mvvm-and-prism/