我正在使用ICommand接口对我的应用程序中的几个按钮执行绑定,即“运行”和“关闭”按钮。我正在使用this问题中提到的帮助方法将ICommand连接到委托,如下所示:
_someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething);
private ICommand _someCommand;
public ICommand SomeCommand
{
get { return _someCommand; }
}
private void DoSomething(object state)
{
// do something here
}
private bool CanDoSomething(object state)
{
// return true/false here is enabled/disable button
}
这似乎工作正常,因为在我的实现中,CanDoSomething返回我在应用程序中的属性值。
如果我将属性的初始值设置为true,则启用该按钮,将其禁用。
我有一系列事件从应用程序层中的BackgroundWorker
引发回ViewModel,它根据应用程序的当前状态将属性值更改为true或false。
我当前遇到的问题是,当我在工作完成后将值设置为true时,该按钮不会“重新启用”。如果我单击窗口中的某个位置,它将更新。所以,因此,我认为手动刷新窗口将解决我的问题,至少在过渡期间。以这种方式做这件事感觉有点粗糙,但我还有点不知所措。
如果有人有任何建议,我会全力以赴。
感谢您的帮助!
伊恩
修改
关于应用程序本身的更多信息。它在应用程序线程中使用后台工作程序来处理“工作”。该应用程序是一个简单的实用程序,用于管理表的创建和将数据加载到表中。我们使用大量预定义的SQL脚本来设置我们的测试环境,因此这是一个简单的实用程序,允许我们根据用户在UI中提供的参数来执行此类操作。
希望这会有所帮助,因为当我重新阅读我的问题时,它读起来好像我在UI线程中做了所有事情,事实并非如此。进度报告被提升回UI线程,除了按钮之外,所有内容都按预期更新。
答案 0 :(得分:4)
CommandManager.InvalidateRequerySuggested()可能是答案 - 它告诉所有命令检查它们是否被启用。
答案 1 :(得分:1)
你必须举起CanExecuteChanged事件:
http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.canexecutechanged.aspx
在您知道应该重新评估单个控件的情况下,这可能比其他答案更有用,并且重新评估所有控件的成本会很高。如果你没有这样的案例,那么另一个答案就更简单了。