2012-11-28 92 views
3

我有一個BusyIndi​​cator,我將IsBusy綁定到我的視圖模型中的Busy屬性。wpf擴展工具包BusyIndi​​cator綁定到屬​​性

<xctk:BusyIndicator IsBusy="{Binding Busy}" x:Name="busyBox" Grid.Row="2" 
       HorizontalAlignment="Center" 
      VerticalAlignment="Center" BusyContent="Contacting Server" > 
    </xctk:BusyIndicator> 

我切換忙爲true,因爲我開始一個Web服務調用(非同步),並將其設置爲在回調虛假的。

這在第一次效果很好,每次之後它都不再顯示忙音。我在回調中添加了一個thread.sleep(僅在x =第二次時它運行得太快)。

我知道我的財產是正確通知,因爲其他綁定控件和按預期工作。它只是似乎BusyIndi​​cator控件是好的只有一個使用

(順便說一句,我使用MVVM光工具包V3)

視圖模型代碼

this.Busy = true; //This proverty is declared correctly with notifications etc 
IPersonSearchService searcher = new PersonSearchService(); //class that does my  webservice, ad i pass it a callback method from my UI (see below) 
searcher.FindByPersonDetails(ps, GetAllPeopleCallback); 


private void GetAllPeopleCallback (PersonSearchResult result, Exception e) 
    { 
     this.Busy = false; 
     ((Models.PersonSearch)this.Model).Persons = result.Persons; //bound to my grid 
     CommandManager.InvalidateRequerySuggested(); //i need to do this to make a button who's canexecute command binding happen   
    } 

這是打web服務類

class PersonSearchService : IPersonSearchService 
{ 
    public void FindByPersonDetails(WSPersonSearch.PersonSearch ps, Action<PersonSearchResult, Exception> Callback) 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 

     worker.DoWork += delegate(object s, DoWorkEventArgs args) 
     { 
      WSPersonSearch.PersonSearch search = (WSPersonSearch.PersonSearch)args.Argument; 
      PersonSearchWebServiceClient wc = new PersonSearchWebServiceClient(); 
      PersonSearchResult r = wc.FindByPersonDetails(ps); 
      args.Result = r; 
     }; 

     worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args) 
     { 
      PersonSearchResult result = (PersonSearchResult)args.Result; 
      Callback(result, null); 
     }; 

     worker.RunWorkerAsync(); 
    } 
} 

UI中的其他所有內容都表現得很好。我的按鈕正確激活/停用。我的網格得到更新很好等等等

+0

你可以在你的回調的ViewModel上發佈代碼嗎? –

+0

如果BusyIndi​​cator控件存在問題,則始終可以創建自己的控件。它並不像看起來那麼困難(您只需將Busy指標和View內容放在沒有行的網格中並將指標的可見性綁定到Busy屬性)。 –

+0

我認爲這不是BusyIndi​​cator,也許可能是一個異步線程問題。也許用WPF的可視線程。也許它使用'SynchronizationContext'來解決'IsBusy'屬性設置爲false。 –

回答

0

我想我解決了它。 看來(通常是這種情況),通過發佈上面的示例代碼(移除我所有的測試混亂),我解決了它。

確定該模型的工作原理,但因爲我正在與一個Web服務通話,並且在第一次調用之後,我的web服務調用在此之後很快就出現了,因此它讓我無法看到bsy infdicator。

所以爲了避開那個......我懶惰了,並增加了一個睡眠。但我把睡眠放在回調中。所以因爲回調在ui線程中被觸發,所以它在錯誤的位置被阻塞。忙碌的指示器在睡眠時已經過去了。

所以我把它轉移到了DoWork方法(它是ui threqad之外的)和繁忙的指示符sstays。

傻我。感謝諮詢人員!