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)?
那就是将MenuItem
的Command
属性绑定到你的视图模型的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/
在 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)?
那就是将MenuItem
的Command
属性绑定到你的视图模型的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/