WPF - MenuItem - 在菜单项上给出确认消息 check/uncheck

WPF - MenuItem - Give a confirmation message on menu item check/uncheck

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

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

执行此操作的最佳方法是什么(如果可能,没有代码隐藏)?

假设您要绑定的 Settings class 是自动生成的 class 扩展 ApplicationSettingsBase,您可以将事件处理程序附加到 SettingChanging and in that event handler show the confirmation dialog and if the user clicks "Cancel" you would need to set e.Cancel = true.

下面是一些伪代码,假设 WpfInit() 将在您首次显示 WPF window:

时调用
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;
  • 我觉得后面的代码会让碰巧阅读您代码的人最清楚地了解您的意图。当然,我确信会有一种方法可以避免代码隐藏,但是恕我直言,仅仅为了避免代码隐藏而避免代码隐藏并不总是代码可读性的最佳实践。

What is the best way to do this (if possible without code behind)?

那就是将MenuItemCommand属性绑定到你的视图模型的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(""));

虽然在视图模型中调用阻塞 MessageBox.Show 方法不是一个好主意,但这是另一个故事:https://blog.magnusmontin.net/2013/04/20/implement-a-confirmation-dialog-in-wpf-with-mvvm-and-prism/