wpf – Windows 8上的命令绑定问题(发布预览版)
最近我有机会玩
Windows 8 Release Preview(Build 8400具体).我的目的是调查只在Windows 8下出现在我们的产品(WPF应用程序)中的错误.这些错误看起来非常简单 – 几个按钮在不应该被禁用时被禁用.看起来容易修复,但我决定找到根本原因.
事实证明,当绑定到命令的控件收到CanExecuteChanged通知时,如果sender不是同一个命令,则它不会重新查询命令的CanExecute方法.在命令对模型执行某些操作并且它的执行能力取决于模型的状态时,这是一个问题.例如,假设您有一个模型: class MyModel { public void ChangeModel(bool makeValidForCommand) { Valid = makeValidForCommand; if (ModelChanged != null) ModelChanged(this,new EventArgs()); } public bool Valid { get; private set; } public event EventHandler ModelChanged; } 还有一个命令: class MyCommand : ICommand { public MyCommand(MyModel model) { _model = model; } public bool CanExecute(object parameter) { return _model.Valid; } public event EventHandler CanExecuteChanged { add { _model.ModelChanged += value; } remove { _model.ModelChanged -= value; } } public void Execute(object parameter) { } private MyModel _model; } 不幸的是,这在Windows 8上不起作用 – 在模型改变状态后,绑定到命令的按钮将保持不正确地禁用(或启用).它在Windows 7上运行得非常好! 该命令可以像这样重写: class MyCommand : ICommand { public MyCommand(MyModel model) { _model = model; } public bool CanExecute(object parameter) { return _model.Valid; } public event EventHandler CanExecuteChanged { add { _canExecuteChanged += value; _model.ModelChanged -= _modelChanged; _model.ModelChanged += _modelChanged; } remove { _canExecuteChanged -= value; _model.ModelChanged -= _modelChanged; } } public void Execute(object parameter) { } private void _modelChanged(object sender,EventArgs e) { if (_canExecuteChanged != null) _canExecuteChanged(this,new EventArgs()); } private event EventHandler _canExecuteChanged; private MyModel _model; } 现在发送者就是命令本身,一切都很好.另一个选择是使用CommandManager及其RequerySuggested事件: public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } 它又有效!嗯,现在我完全不解了.发件人不是命令 – 它是null,但是如果我尝试使用null sender发送我自己的事件,它将无法再次运行. 有人面对同样的事吗?在新Windows上这是一种奇怪的优化方式吗?老实说,它看起来更像一个bug. 解决方法
似乎,这是.Net Framework 4.5的一个重大变化.
这个问题在这里报告给微软: http://connect.microsoft.com/VisualStudio/feedback/details/751429/wpf-icommand-canexecutechanged-behaviour-change-in-net-4-5 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |