Как скрыть кнопку асинхронного обратного вызова в wp7? - PullRequest
0 голосов
/ 27 марта 2011

Нужный сценарий: когда я нажимаю на кнопку, я хочу, чтобы она была скрыта до завершения асинхронного вызова.

У меня есть кнопка в xaml, подобная этой

    <Button Name="btnLoadNextTransactions" Content="Button" Click="btnLoadNextTransactions_Click"  Visibility="{Binding LoadMore, Converter={StaticResource converter}}" />

событие щелчка на

 private void btnLoadNextTransactions_Click(object sender, RoutedEventArgs e)
    {
        App.ViewModel.LoadMore = false;
        ApplicationBl<Transaction>.GetDataLoadingCompleted += GetDataLoadingCompleted;
        ApplicationBl<Transaction>.GetData(++offset*10, 10);//works only if I comment out this line
        App.ViewModel.LoadMore = true;
    }

Это работает, только если я закомментирую асинхронный вызов

//ApplicationBl<Transaction>.GetData(++offset*10, 10);

Но я не хочу комментировать эту функцию :) Я знаю, что мне не хватает некоторыхdelagete или диспетчер.Я только начал кодировать с SL.

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Что происходит, так это то, что линия

ApplicationBl<Transaction>.GetData(++offset*10, 10);

Не блокирует поток диспетчеризации, поэтому LoadMore = true get вызывается сразу. Самый простой способ сделать это, вероятно, будет с делегатом, которого вы вызываете после получения данных.

Таким образом, вы изменили бы свой метод GetData так:

public void GetData( int offset, int pageSize, Action callback)
{
  //Existing code.

  //Notify the callback that we are done.
  callback();
}

Как только это будет сделано, просто вызовите метод следующим образом:

ApplicationBl<Transaction>.GetData(++offset*10, 10, () =>
{
  Deployment.Current.Dispatcher.BeginInvoke(() => App.ViewModel.LoadMore = true;);
});

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

1 голос
/ 27 марта 2011

Необходимо указать LoadMore = true в методе GetDataLoadingCompleted.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...