2011-07-29 60 views
0

我的应用程序执行Web服务调用,当它发生时,IsExecuting状态设置为true,并且执行按钮被禁用。由于在此期间应用程序没有响应,因此我更改了进程,以便在单独的线程中执行。然而,我现在注意到的问题是,执行按钮仍然被禁用,只有当我点击界面按钮启用。我怎样才能解决这个问题?WPF CanExecute和线程池

编辑: 在代码隐藏:

private void Execute() 
{ 
    ThreadPool.QueueUserWorkItem(new WaitCallback(ExecuteThread)); 
} 

private bool CanExecute 
{ 
    get { return !IsExecuting; } 
} 

private void ExecuteThread(Object o) 
{ 
    IsExecuting = true; 

    // Process execution here ... 

    IsExecuting = false; 
} 


In Xaml: 

<Button Content="Execute" Command="{Binding Path=ExecCommand}"/> 

回答

2

所以你需要刷新你的命令的CanExecute状态更新按钮的状态?只需拨打CommandManager.InvalidateRequerySuggested(),这将导致CanExecute在绑定命令上被重新评估。

+0

我已经试过这一点,但它并没有帮助。 – Sys

+2

@sys,试图调用UI线程这种方法(使用Dispatcher.Current.Invoke) –

+0

我试过Application.Current.Dispatcher.Invoke(新的行动(代表{IsExecuting = TRUE;}));但再次不工作... – Sys

0

我想你应该张贴一些代码,以便更好地理解您的问题。

我敢肯定这是一个线程问题,因为你不能从一个不同的线程控制的表单的状态改变。

我认为,所有你需要的就是使用委托给其他线程

How to update the GUI from another thread in C#?

+0

我可以将其作为在ExecuteThread方法的最后一行添加一段代码 – Sys