1)您可以从一个基本的ViewModel中继承View1Model和View2Model,并在其中定义ShowMainMenu。
或者(这是我的方法)
创建RootView,其中包含ContentPresenter来显示所有视图。创建RootViewModel并使用属性ViewContent。将ContentPresenter的Content属性绑定到RootViewModel的ViewContent属性。您可以使用“object”作为ViewContent的类型,但我建议您定义界面,该界面由MainVView1Model、View1Model和View2Model支持。更改ViewContent必须引发PropertyChangedEvent。
在RootViewModel中定义ShowMainViewCommand,它将只是将ViewContent更改为MainViewModel(它将显示为主视图)。然后将View1和View2中的Button的Command属性绑定到该命令,例如:
{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中 - 这是影响其他控件的方法。 MainViewModel必须包含包含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)
{
_AddItemToUC2 = new RelayCommand(x => _Parent.UC2Content.Items.Add(...));
}
return AddItemToUC2;
}
}
...
}