我有一个TreeView,我将ContextMenu与之关联起来。那个contextmenu有一个项目,其IsChecked属性我想绑定到我的ViewModel。由于我使用的是树,因此每个treeitem都绑定到我的ViewModel的子属性。
在VS2010输出窗口中,我看到了这个数据绑定错误:
BindingExpression路径错误:'object'''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}}}
答案 0 :(得分: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>
这是我的工作代码段。感谢[this]。1您只需更改标签中的绑定路径即可。我目前正在将Treeview绑定到字典,因此它是它的Key属性。绑定到任何对象集合应该没有任何问题。一个有趣的发现是上下文菜单不是元素树的一部分,这导致了问题。我可以毫无问题地绑定文本框:
<TextBlock Grid.Row="1" DataContext="{Binding ElementName=tview, Path=SelectedItem}">
<TextBlock.Text>
<Binding Path="Key" />
</TextBlock.Text>
</TextBlock>
但如果我把同样的东西放在menuitem上,它就不起作用了。