我是wpf世界的新手。我在shell中有一个上下文菜单,如下所示:
<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 menuitem的itemssource AppModules
中的每个元素都有一个名为MainViewType
的{{1}}类型的属性。我想在点击菜单项时更改区域的视图,并考虑在System.Type
中使用单个ICommad
并将shellviewmodel
作为命令参数传递。但是,上面的代码不起作用。
我想知道为什么MainViewType
菜单项会按预期填充Modules
。
我注意到itemssource
menuitem上的命令绑定也没有用,即使它应该有,因为Login
的{{1}}属性被正确限制。任何人都可以建议如何使它工作?
答案 0 :(得分:0)
上下文菜单与窗口的其余部分不在同一个可视树中,因此在绑定中使用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>