2009-08-13 5 views
4

У меня есть всплывающее окно с графическим интерфейсом команды связыванияWPF Gui обновить из разных тему

<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; 

Его прекрасно работать, когда я использую его из тот же поток, когда я получаю обратный вызов из веб-службы, который находится в другом потоке, я использую диспетчер для отображения сообщения, я могу видеть новый текст во всплывающем окне, но привязка не работает, кнопка остается недоступной (CanExecute = false) , Когда я нажимаю на экран с помощью мыши, всплывающее окно обновляет реальное значение CanExecute a d появится кнопка.

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

      })); 
+0

В чем Ваш вопрос, точно? –

+0

Зачем вам нужно изменить CommandBinding кнопки? –

+0

@dmitri Я думаю, что он хочет знать, почему команды обновляются только после того, как он щелкнул по экрану. – ArielBH

ответ

1

Вы должны использовать диспетчер, чтобы получить обновление видимости пройти через основной GUI поток (например, вам нужно использовать Invoke с WinForms)

См MSDN Forums подробности.

В основном что-то в этом роде;

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

Трудно сказать по этому вопросу, но я думаю, что он уже делает это, основываясь на последнем разделе кода. – ArielBH

12

это фрагмент кода, который я использую для исправления любых вызовов перекрестных потоков при обновлении пользовательского интерфейса WPF.

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

Надеется, что это помогает

2

Вашего вопрос не с резьбой, это с тем, что будет вызывать команду для вызова CanExecute.

Обычно только определенные события gui будут вызывать перенаправленные команды для обновления, и поскольку WPF не знает, чтобы позвонить CanExecute, когда данные меняются, это не так.

Чтобы вручную вызвать все перенаправленные команды для обновления, вызовите CommandManager.InvalidateRequerySuggested. Если команда основана на сообщении, которое я бы назвал, когда сообщение было изменено.

Смежные вопросы