使用MVVM的WPF +绑定命令和上下文菜单项的标题

时间:2011-06-11 11:06:29

标签: wpf mvvm binding header command

我创建了一个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> 

3 个答案:

答案 0 :(得分:1)

嗨确定了问题。

如果我们将上下文菜单的Item Source设置为BOList(observable collection)命令,则不会被触发,因为ICommand定义在Window数据上下文(vm)中。

我们需要像明智一样处理代码。

由于无法进行调试,因此我在丛林中殴打: - )

这个链接帮了我很多WPF Tutorial - Debug Databinding Issues in WPF

答案 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}}" />