WPF Treeview contextmenu IsChecked绑定MVVM

时间:2010-03-27 01:23:08

标签: wpf data-binding treeview contextmenu

我有一个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}}}

1 个答案:

答案 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上,它就不起作用了。