2010-03-27 201 views
0

我有一个TreeView,我将它关联到一个ContextMenu。该contextmenu有一个项目,我想要绑定到我的ViewModel的IsChecked属性。由于我正在使用树,因此每个treeitem都绑定到ViewModel的子属性。WPF Treeview contextmenu IsChecked绑定MVVM

在VS2010输出窗口我看到这个数据绑定错误:

BindingExpression路径错误:对 '对象' '' HostMgmtViewModel '(的HashCode = 12565727)' 未找到 'IsAutoStart' 属性。 BindingExpression:路径= IsAutoStart; DataItem ='HostMgmtViewModel'

这清楚地表明它试图绑定到我的ViewModel而不是绑定到treeitem的关联数据。我如何绑定到正确的对象?请记住,我的contextmenu与整个TreeView关联,而不是与特定的Treeitem关联。

----------编辑

由于xandy指出了解决我的问题下面是绑定器isChecked这样的:

{Binding Path=PlacementTarget.SelectedItem.IsDisabledStart, Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}} 

回答

3
<TreeView Name="tview" Grid.Row="0" Tag="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}"> 
     <TreeView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Name="miC" Header="{Binding Path=Tag.Key}" DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"></MenuItem> 
      </ContextMenu> 
     </TreeView.ContextMenu> 
    </TreeView> 

这是我的工作代码片段。礼貌[这]。 1您只需更改标签中的绑定路径即可。我目前将Treeview绑定到一个字典,所以它是它的Key属性。它在绑定到任何对象集合时不应该有任何问题。一个有趣的发现是上下文菜单不是元素树的一部分,这导致了问题。我可以绑定文本框没有问题:

<TextBlock Grid.Row="1" DataContext="{Binding ElementName=tview, Path=SelectedItem}"> 
     <TextBlock.Text> 
      <Binding Path="Key" /> 
     </TextBlock.Text> 
    </TextBlock> 

但它不起作用,如果为menuitem,如果我把同样的事情。

+0

而这个绑定进入ContextMenu?当我尝试得到这个错误时:'绑定'不能在'ItemCollection'集合中使用。 '绑定'只能在DependencyObject的DependencyProperty上设置。 – BrettRobi 2010-03-27 01:47:25

+0

顺便说一句,我以前的答案是假设像上面的文本块例子,但适用于menuitem头。菜单项没有遇到任何错误,但它不起作用。你得到了DependencyObject ...错误,因为你绑定了数据源,但不是属性。 – xandy 2010-03-27 02:59:51

+0

谢谢xandy,你的样品给了我正确的答案。我结束了菜单项IsChecked绑定到这个: {Binding Path = PlacementTarget.SelectedItem.IsAutoStart,Mode = OneWay,RelativeSource = {RelativeSource AncestorType = {x:Type ContextMenu}}} – BrettRobi 2010-03-27 14:30:26