1) Вы можете наследовать View1Model и View2Model от одной базовой ViewModel и определять там ShowMainMenu.
или (это мой подход)
Создайте RootView с ContentPresenter, который покажет все ваши представления. Создайте RootVeiwModel со свойством ViewContent. Привязать свойство содержимого ContetnPresenter к свойству ViewContent объекта RootViewModel. Вы можете использовать object
в качестве типа ViewContent, но я советую вам определить интерфейс, который поддерживается MainVView1Model, View1Model и View2Model. Изменение ViewContent должно вызвать ProprtyChangedEvent.
Определите ShowMainViewCommand в RootViewModel, который просто изменит ViewContent на MainViewModel (и он будет отображаться как MainView). Затем свяжите свойство Command для Button в View1 и View2 с этой командой, например, следующим образом:
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type RootView}},
Path=DataContext.ShowMainViwe}
Есть некоторый код, объясняющий, что я пытаюсь сказать:
RootView.xaml
...
<ContentPresenter Content={Binding ViewContent} />
...
RootViewModel.ca
class RootViewModel : INotifyPropertyCahnged
{
...
private object _ViewContent;
public object ViewContent
{
get {return _ViewContent;}
set
{
_ViewContent = value;
if (PropertyChanged != null)
{
PropertyChanged ("ViewContent");
}
}
}
private RelayCommand _ShowMainView;
public ICommand ShowMainView
{
get
{
if (_ShowMainView == null)
{
_ShowMainView = new RelayCommand(x => ViewContent = new MainViewModel());
}
return _ShowMainView;
}
}
...
}
2) Добавить ссылку на MainViewModel в UC1ViewModel и UC2ViewModel - так можно влиять на другие элементы управления. MainViwModel должен содержать свойства, содержащие UC1ViewModel и UC2ViewModel. Элементы второго пользовательского элемента управления должны содержаться в ObservableCollection.
Я просто покажу вам, как это работает по коду:
class UC1ViewModel : INotifyPropertyChanged
{
...
private MainViewModel _Parent;
public UC1ViewModel(MainViewModel parent)
{
_Panert = parent;
}
private RelayCommand _AddItemToUC2;
public ICommand AddItemToUC2
{
get
{
if (_AddItemToUC2 = null)
{
// UC2Content is UC2ViewModel
// Items is ObservableCollection
_AddItemToUC2 = new RelayCommand(x => _Parent.UC2Content.Items.Add(...));
}
return AddItemToUC2;
}
}
...
}