2013-02-12 60 views
2

我的視圖模型爲:MVVM活動指示器在視圖模型

public class SampleViewModel : ViewModelBase 
{ 
private bool isBusy; 
public bool IsBusy 
{ 
    get { return isBusy; } 
    set { isBusy = value; 
     RaisePropertyChanged("IsBusy"); } 

private string prop1; 
public string Prop1 
{ 
    get { return prop1; } 
    set { prop1 = value; 
     RaisePropertyChanged("Prop1"); } 
} 

private string prop2; 
public string Prop2 
{ 
    get { return prop2; } 
    set { prop2 = value; 
     RaisePropertyChanged("Prop2"); } 
} 

private string prop3; 
public string Prop3 
{ 
    get { return prop3; } 
    set { prop3 = value; 
     RaisePropertyChanged("Prop3"); } 
} 

public SampleViewModel() 
{ 
    new Task(() => LoadProp1Async()).Start(); 
    new Task(() => LoadProp2Async()).Start(); 
    new Task(() => LoadProp3Async()).Start(); 
} 

private void LoadProp1Async() 
{ 
    Thread.Sleep(5000); 
    Prop1 = "a"; 
} 

private void LoadProp2Async() 
{ 
    Thread.Sleep(15000); 
    Prop2 = "b"; 
} 

private void LoadProp3Async() 
{ 
    Thread.Sleep(10000); 
    Prop3 = "c"; 
} 
} 

查看:

<toolkit:BusyIndicator BusyText="Loading..." IsBusy="{Binding IsBusy}" /> 

我想展示活動指示器,同時視圖模型屬性IsBusy ==真。 當三個任務中的任何一個正在運行時,此屬性爲true。

我怎樣才能實現這一目標? 我有一個解決方案(使用中介),但我不喜歡它。

回答

4

如果你在.NET 4.5,你可以使用WhenAll建立一個加盟延續:

public SampleViewModel() 
{ 
    IsBusy = true; 
    var task1 = Task.Run(() => LoadProp1Async()); 
    var task2 = Task.Run(() => LoadProp2Async()); 
    var task3 = Task.Run(() => LoadProp3Async()); 
    Task.WhenAll(task1, task2, task3).ContinueWith(t => IsBusy = false); 
} 

如果沒有,你可以不喜歡一個爲WaitAll另一個任務中:

public SampleViewModel() 
{ 
    IsBusy = true; 
    new Task(() => 
    { 
     var task1 = new Task(() => LoadProp1Async()); 
     var task2 = new Task(() => LoadProp2Async()); 
     var task3 = new Task(() => LoadProp3Async()); 
     task1.Start(); 
     task2.Start(); 
     task3.Start(); 
     Task.WaitAll(task1, task2, task3); 
     IsBusy = false; 
    }).Start(); 
} 
+0

感謝爲好的答案 – Coffka 2013-02-12 06:08:56