我有一個BusyIndicator,我將IsBusy綁定到我的視圖模型中的Busy屬性。wpf擴展工具包BusyIndicator綁定到屬性
<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 =第二次時它運行得太快)。
我知道我的財產是正確通知,因爲其他綁定控件和按預期工作。它只是似乎BusyIndicator控件是好的只有一個使用
(順便說一句,我使用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中的其他所有內容都表現得很好。我的按鈕正確激活/停用。我的網格得到更新很好等等等
你可以在你的回調的ViewModel上發佈代碼嗎? –
如果BusyIndicator控件存在問題,則始終可以創建自己的控件。它並不像看起來那麼困難(您只需將Busy指標和View內容放在沒有行的網格中並將指標的可見性綁定到Busy屬性)。 –
我認爲這不是BusyIndicator,也許可能是一個異步線程問題。也許用WPF的可視線程。也許它使用'SynchronizationContext'來解決'IsBusy'屬性設置爲false。 –