Я знал, что все, что я делал раньше, было обходным путем, и это было грязно. Как я понял больше о MVVM, я продолжал перефакторинг кода. Вот что я сделал.
Добавлено свойство ICommand для SaveCommand в MainWindowViewModel и привязано к кнопке инструментов в главном окне. Он просто делегирует вызов SaveCommand текущего активного WorksSpaceViewModel.
public override ICommand SaveCommand
{
get
{
return _currentWorkspace != null ? _currentWorkspace.SaveCommand : new RelayCommand ( null, param => false);
}
}
и, как и в исходном коде, где он отслеживает текущее рабочее пространство, убедитесь, что я уведомил подсистему об изменении
public ObservableCollection<WorkspaceViewModel> Workspaces
{
get
{
if (_workspaces == null)
{
_workspaces = new ObservableCollection<WorkspaceViewModel>();
_workspaces.CollectionChanged += OnWorkspacesChanged;
CollectionViewSource.GetDefaultView(_workspaces).CurrentChanged += new EventHandler(MainWindowViewModel_CurrentChanged);
}
return _workspaces;
}
}
private void MainWindowViewModel_CurrentChanged(object sender, EventArgs e)
{
CurrentWorkspace = CollectionViewSource.GetDefaultView(_workspaces).CurrentItem as WorkspaceViewModel;
OnPropertyChanged("SaveCommand");
}
public WorkspaceViewModel CurrentWorkspace
{
get { return _currentWorkspace; }
set
{
_currentWorkspace = value;
OnPropertyChanged("CurrentWorkspace");
}
}
вот и все, WPF позаботился обо всем остальном (т.е. включил, отключив кнопку в зависимости от проверок)!
Опять же, спасибо за ваш совет, Пол.