2009-08-13 58 views
4

刷新我有命令綁定一個彈出桂,WPF桂由不同的線程

<Grid x:Name="popup" Visibility="Hidden" DataContext="{Binding Path=PopupMsg}" > 


        <TextBlock x:Name="tbMessage" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Margin="20,70,10,0" 
          Text="{Binding Path=Message}" FontSize="16"/> 

        <Button x:Name="btnPopupOk" Grid.Row="1" Grid.Column="2" Content="{Binding Path=OkContent}" Margin="10,40,10,10" 
         Command="{Binding}" CommandParameter="true" /> 
       </Grid> 
      </Border> 
     </Grid> 
在C#文件

我綁定命令:

CommandBinding okCommandBinding = new CommandBinding(OkCommand); 
    okCommandBinding.Executed += popupButtons_Executed; 
    okCommandBinding.CanExecute += okCommandBinding_CanExecute; 
    CommandBindings.Add(okCommandBinding); 
    btnPopupOk.Command = OkCommand; 

其工作正常,當我使用它從同樣的線程,當我從一個不同的線程中的Web服務獲取回調時,我使用Dispatcher顯示一條消息,我可以看到彈出式窗口中的新文本,但綁定不起作用,按鈕仍然不可用(CanExecute = false) ,當我用鼠標點擊屏幕時,彈出窗口會更新CanExecute的實際值d該按鈕顯示爲可用。

System.Windows.Threading.DispatcherPriority.Normal, 
      new Action(
      delegate() 
      { 
       popup.Visibility = Visibility.Visible; 
       popup.Focus(); 

      })); 
+0

你的問題到底是什麼? – 2009-08-13 09:05:41

+0

爲什麼你需要改變按鈕的CommandBinding? – 2009-08-13 09:06:42

+0

@dmitri我想他想知道爲什麼命令只有在他點擊屏幕後纔會更新。 – ArielBH 2009-08-13 09:19:32

回答

1

你需要使用一個調度程序來獲取知名度的更新要經過主界面線程(像你需要使用調用與的WinForms)

詳見MSDN Forums

基本上類似於;

popup.Dispatcher.Invoke(DispatcherPriority.Normal, delegate() { popup.Visibilty = Visibility.Visible; popup.Focus(); }); 
+0

這個問題很難說清楚,但我認爲他已經在根據最後的代碼部分進行操作了。 – ArielBH 2009-08-13 09:15:59

12

這是我用來在更新WPF UI時修復任何交叉線程調用的代碼片段。

this.Dispatcher.BeginInvoke(
      (Action)delegate() 
     { 
      //Update code goes in here 
     }); 

希望這有助於

2

你的問題是不與線程,這是什麼會導致命令來調用CanExecute

通常只有某些gui事件會導致路由命令更新,並且由於WPF在數據更改時不知道調用CanExecute,所以不會。

要手動導致所有路由命令更新,請致電CommandManager.InvalidateRequerySuggested。如果該命令基於消息發生更改時將調用的消息。