C# viewmodel中的MVVM抖动器
我的ViewModel是:C# viewmodel中的MVVM抖动器,c#,.net,wpf,data-binding,mvvm,C#,.net,Wpf,Data Binding,Mvvm,我的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 {
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";
}
}
视图:
我想在viewmodel属性为Busy==true时显示throbber。
当三个任务中的任何一个正在运行时,此属性为true
我怎样才能做到这一点?
我个人有一个使用mediator的解决方案,但我不喜欢它。如果您使用的是.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();
}
如果您使用的是.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();
}