2011-06-11 81 views
2

我创建了一个WPF应用程序,并遵循MVVM模式。我在我的xaml中有一个上下文菜单,我需要绑定命令和标题文本。使用下面的代码,我可以将上下文菜单的Header绑定到作为可观察集合的BOList属性中的“MenuItemName”。我的问题是,命令没有被解雇?我将上下文菜单的Item源更改为datacontextWPF +使用MVVM的上下文菜单项的绑定命令和标题

(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

什么是MenuItemName看起来像视图模型?在控制台输出中查找Beinding表达式错误,并发布它是什么,如果你看到它。 – Berryl 2011-06-11 23:12:23

回答

0

在上下文菜单中使用的DataContext,而不是使用项目源
然后绑定你的菜单项

+0

我试过了,如果datacontext设置命令的作品,但头属性绑定失败,,如果项目源设置标题绑定工作,但命令绑定失败,,, – user793886 2011-06-11 14:08:52

+1

嗨确定问题。如果我们将上下文菜单的Item Source设置为BOList(observable collection),那么命令将不会被触发,因为icommand定义在Window data ciontext(vm)中。我们需要像智者一样处理代码。由于调试是不可能的绑定,我在围绕布什:-)。这个链接帮了我很多http://www.wpftutorial.net/DebugDataBinding.html – user793886 2011-06-12 07:39:34

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}}" /> 
+0

没有它不适合我... – user793886 2011-06-11 16:53:53

+0

如果你设置DataContext然后命令bindinng发生,如果我们设置项目源头标绑定发生.. user793886 2011-06-11 17:00:00

+0

你能解释一下吗? – 2011-06-11 17:46:43

1

喜标识的问题。

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

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

由于调试是不可能的结合,我拐弯抹角:-)

此链接击败帮了我很多WPF Tutorial - Debug Databinding Issues in WPF