2013-02-12 3 views
2

Мои ViewModel является:MVVM Throbber в ViewModel

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}" /> 

Я хочу показать Throbber то время как ViewModel свойство IsBusy == верно. Это свойство верно, если выполняется любая из трех задач.

Как я могу достичь этого? У меня есть одно решение лично (с использованием медиатора), но мне оно не нравится.

ответ

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