如何在WPF中手动刷新窗口?

时间:2010-08-15 21:18:49

标签: c# wpf .net-3.5 mvvm

我正在使用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线程,除了按钮之外,所有内容都按预期更新。

2 个答案:

答案 0 :(得分:4)

CommandManager.InvalidateRequerySuggested()可能是答案 - 它告诉所有命令检查它们是否被启用。

答案 1 :(得分:1)

你必须举起CanExecuteChanged事件:

http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.canexecutechanged.aspx

在您知道应该重新评估单个控件的情况下,这可能比其他答案更有用,并且重新评估所有控件的成本会很高。如果你没有这样的案例,那么另一个答案就更简单了。

相关问题