带棱镜的mvvm:从菜单项设置视图



我是wpf世界的新手。我在外壳中有一个上下文菜单,如下所示:

              <ContextMenu>
                <MenuItem Header="Login" 
                          Command="{Binding WorkSpaceViewSetter}" CommandParameter="DemoApplication.View.LoginView">
                    <MenuItem.Icon>
                        <Image Height="16" Width="16" Stretch="Uniform" Source="/Images/login.png"/>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="Modules" ItemsSource="{Binding AppModules}">
                    <MenuItem.Icon>
                        <Image Source="/Images/modules.png"/>
                    </MenuItem.Icon>
                    <MenuItem.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                            <Setter Property="Header" Value="{Binding ModuleName}"/>
                            <Setter Property="Command" Value="{Binding ElementName=win, Path=DataContext.WorkSpaceViewFromType}"/>  
                            <Setter Property="CommandParameter" Value="{Binding MainViewType}"/>                       
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>
           </ContextMenu>

Modules菜单项的项源AppModules中的每个元素都有一个名为MainViewType、类型为System.Type的属性。我想在单击菜单项时更改区域的视图,并考虑在shellviewmodel中使用单个ICommad,并将MainViewType作为命令参数传递。但是,上面的代码不起作用。我想知道为什么Modules菜单项会像预期的那样从itemssource中填充。

我注意到Login菜单项上的命令绑定也不起作用,尽管它应该起作用,因为Modulesitemssource属性得到了正确的绑定。有人能建议一下如何让它发挥作用吗?

上下文菜单与窗口的其他部分不在同一个可视化树上,因此在绑定中使用ElementName是不起作用的。您需要使用PlacementTarget。如果不知道视图模型的结构,很难给出明确的答案,但您的解决方案看起来像:

<MenuItem.ItemContainerStyle>
    <Style TargetType="MenuItem">
      <Setter Property="Header" Value="{Binding ModuleName}"/>
      <Setter Property="Command" Value="{Binding PlacementTarget.DataContext.WorkSpaceViewFromType}"/>  
      <Setter Property="CommandParameter" Value="{Binding MainViewType}"/>                       
   </Style>
</MenuItem.ItemContainerStyle>

最新更新