2011-03-26 56 views
0

期望的場景: 當我點擊按鈕時,我希望它被隱藏,直到異步調用完成。如何在wp7中隱藏異步回調按鈕?

我有這樣

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

在XAML一個按鈕和一個點擊事件

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編碼。

回答

1

您需要將LoadMore = true放入GetDataLoadingCompleted方法中。

1

發生了什麼事是該行

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

沒有阻止調度線程,所以LoadMore =真正獲取的立刻調用。最簡單的方法可能是在獲取數據後調用委託。

所以,你會改變你的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 Elements,因此需要在UI線程上完成。

+0

很好的答案,將測試它,也許你已經回答了問題。正是我需要知道事情如何運作。 – nemke 2011-03-28 17:44:53