在WPF中,我有一个绑定到设置的MenuItem,我希望每次用户点击时都会弹出一个消息框。
<MenuItem IsCheckable="True" Header="MyConfig" IsChecked="{Binding Source={x:Static res:Settings.Default},
Path=MyConfigPath, Mode=TwoWay}"/>
最好的方法是什么(如果没有代码可能的话)?
答案 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");
}
}
注意:
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/