Подробное решение и ссылка для получения файла, относящегося к статье
В итоге я использовал MVVMLight. Всем функциям из этой библиотеки предшествует GS
XAML
<Window.Resources>
<local:ViewModelLocator x:Key="Locator"/>
</Window.Resources>
<Grid DataContext="{Binding Main, Source={StaticResource Locator}}" >
<Label Content="{Binding SubVM2.MyValue}" FontSize="40"/>
<Button Command="{Binding SubVM1.OkCommand}" Width="100" Height="100" Content="GO"/>
</Grid>
MainVM
public class MainVM : VMBase
{
public SubVM1 SubVM1 { get; }
public SubVM2 SubVM2 { get; } = new SubVM2();
public MainVM()
{
SubVM1 = new SubVM1(SubVM2);
//Subvm2 = new SubVM2();
}
}
SubVM1 (использование IsBusy в качестве параметра canexecute)
using GS = GalaSoft.MvvmLight.Command;
[...]
public class SubVM1 : VMBase
{
private SubVM2 _subVM2 { get; set; }
private bool _isBusy;
public bool IsBusy
{
get => _isBusy;
set
{ _isBusy = value; OnPropertyChanged("IsBusy"); }
}
public SubVM1() { }
public SubVM1(SubVM2 SubVM2)
{
_subVM2 = SubVM2; ;
}
private GS.RelayCommand _okCommand;
public GS.RelayCommand OkCommand
{
get
{
return _okCommand
?? (_okCommand = new GS.RelayCommand(
async () =>
{
IsBusy = true;
Console.WriteLine(IsBusy);
await Task.Run(
() =>
{
// This is a background operation!
IsBusy = true;
_subVM2.MyValue = 0;
while (_subVM2.MyValue < 30)
{
_subVM2.MyValue++;
// Sleep for a while
Thread.Sleep(500);
}
});
IsBusy = false;
Console.WriteLine(IsBusy);
},()=> { return !IsBusy; },false));
}
}
}
SubVM2
public class SubVM2 : VMBase {
private double _myValue;
public double MyValue
{
get => _myValue;
set
{ _myValue = value; OnPropertyChanged("MyValue"); }
}
public SubVM2() { } }
ViewModelLocator
public class ViewModelLocator
{
/// <summary>
/// Initializes a new instance of the ViewModelLocator class.
/// </summary>
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
////if (ViewModelBase.IsInDesignModeStatic)
////{
//// // Create design time view services and models
//// SimpleIoc.Default.Register<IDataService, DesignDataService>();
////}
////else
////{
//// // Create run time view services and models
//// SimpleIoc.Default.Register<IDataService, DataService>();
////}
SimpleIoc.Default.Register<MainVM>();
}
public MainVM Main
{
get
{
return ServiceLocator.Current.GetInstance<MainVM>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
Я не знаю, насколько красиво это решение, поэтому я немного подожду, прежде чем отмечать его как ответ. Но он выполняет свою работу за меня! :)