【问题标题】:How do you manually refresh a window in WPF?如何在 WPF 中手动刷新窗口?
【发布时间】:2011-03-30 04:37:54
【问题描述】:

我正在使用 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,则按钮启用,false 禁用。

我有一系列从应用程序层中的 BackgroundWorker 引发的事件返回到 ViewModel,这些事件根据应用程序的当前状态将属性的值更改为 true 或 false。

我目前遇到的问题是,当我在工作完成后将值设置为 true 时,按钮没有“重新启用”。如果我单击窗口内的某个位置,它将更新。因此,因此,我认为手动刷新窗口将解决我的问题,至少暂时如此。这样做感觉有点恶心,但我有点不知所措。

如果有人有任何建议,我会全力以赴。

感谢您的帮助!

伊恩

编辑 -

有关应用程序本身的更多信息。它在应用程序线程中使用后台工作者来处理“工作”。该应用程序是一个简单的实用程序,用于管理表的创建和将数据加载到表中。我们使用大量预定义的 SQL 脚本来设置我们的测试环境,因此这是一个简单的实用程序,它允许我们根据用户在 UI 中提供的参数来执行此类操作。

希望这会有所帮助,因为当我重新阅读我的问题时,它看起来好像我在 UI 线程中做所有事情,但事实并非如此。进度报告会返回到 UI 线程,并且所有内容都按预期更新,除了按钮..

【问题讨论】:

    标签: c# wpf .net-3.5 mvvm


    【解决方案1】:

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

    【讨论】:

    • 完美——因为我只使用了两个命令,并且都需要更新,所以这很完美。
    【解决方案2】:

    您必须引发 CanExecuteChanged 事件:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 2015-01-08
      • 2010-10-29
      • 2010-11-03
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多