首先,我认为你应该保留代码后端事件处理程序,没有必要为了没有实际意义而将一个简单的两行事件处理程序变成复杂的命令驱动怪物(不要说可测试性,这是主菜单,在每次运行应用程序时都会进行测试)。
现在,如果你确实想走纯 MVVM 路线,你只需让菜单触发一个命令。首先,在某个资源部分添加此样式:
<Style x:Key="MenuItemStyle" TargetType="MenuItem">
<Setter Property="Command"
Value="{Binding DataContext.SwitchViewCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"/>
<Setter Property="CommandParameter"
Value="{Binding}"/>
</Style>
这个样式会使得菜单项在附加的视图模型上触发SwitchViewCommand命令,并将MenuItem的DataContext作为命令参数。
实际的视图与您的代码相同,只是增加了对该样式的引用作为ItemContainerStyle(因此它适用于菜单项而不是DataTemplate的内容):
<DockPanel LastChildFill="False">
<Menu DockPanel.Dock="Top"
ItemsSource="{Binding PageItemsMainMenu}"
ItemTemplate="{StaticResource MainMenuStyle}"
ItemContainerStyle="{StaticResource MenuItemStyle}"/>
<ContentControl
Content="{Binding SelectedPageItem}"/>
</DockPanel>
现在在视图模型中,你需要这样做(我使用字符串,因为没有你的PageItem代码):
private string _selectedViewItem;
public List<string> PageItemsMainMenu { get; set; }
public string SelectedPageItem
{
get { return _selectedViewItem; }
set { _selectedViewItem = value; OnNotifyPropertyChanged("SelectedPageItem"); }
}
public ICommand SwitchViewCommand { get; set; }
使用您所用的任何命令类来调用此代码:
private void DoSwitchViewCommand(object parameter)
{
SelectedPageItem = (string)parameter;
}
现在,当用户点击菜单项时,菜单项将使用页面项作为参数调用SwitchViewCommand。
该命令将调用DoSwitchViewCommand,设置SelectedPageItem属性。
该属性将引发NotifyPropertyChanged事件,通过数据绑定使UI更新。
或者,您可以编写一个两行的事件处理程序,由您选择。