我创建了一个WPF应用程序并遵循MVVM模式。我的xaml中有一个上下文菜单,我需要绑定命令和Header文本。使用下面的代码,我可以将上下文菜单的Header与“MenuItemName”绑定,后者是BOList中的一个属性,它是一个可观察的集合。我的问题是命令没有被解雇?我将Context菜单的Item源更改为datacontext
(DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}")
命令工作正常,但我的标题变得空白。有没有办法绑定我的标题和菜单项的命令?这里的命令MenuClick是VM中的Icommand属性,MenuItemName是BOList中的一个属性,它是一个绑定到我的ListBox的可观察集合。
<Grid>
<StackPanel Orientation="Vertical">
<Button x:Name="btnClickMe" Command="{Binding ButtonCommand}" Content="Click Me" />
<ListBox ItemsSource="{Binding BOList}" x:Name="lstDemo" SelectedItem="{Binding BussinessObj,Mode=OneWayToSource}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel x:Name="stkStyleRender" Orientation="Horizontal" Background="Cyan" Width="525" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" >
<TextBlock x:Name="txtId" Text="{Binding FirstName}"></TextBlock>
<TextBlock x:Name="txtName" Text="{Binding LastName}"></TextBlock>
<StackPanel.ContextMenu>
<ContextMenu x:Name="cntMnuTest" ItemsSource ="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" >
<MenuItem Header="{Binding MenuItemName}" Command="{Binding MenuClick}" CommandParameter="Icon"></MenuItem>
</ContextMenu>
</StackPanel.ContextMenu>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
答案 0 :(得分:1)
嗨确定了问题。
如果我们将上下文菜单的Item Source设置为BOList(observable collection)命令,则不会被触发,因为ICommand
定义在Window数据上下文(vm)中。
我们需要像明智一样处理代码。
由于无法进行调试,因此我在丛林中殴打: - )
答案 1 :(得分:0)
在上下文菜单中使用DataContext而不是使用Items source
然后绑定您的菜单项
答案 2 :(得分:0)
试试这个:
<MenuItem Header="{Binding Path=PlacementTarget.MenuItemName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}" Command="{Binding Path=PlacementTarget.MenuClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}" />