使用ItemSsource绑定到上下文菜单

时间:2012-04-11 20:47:51

标签: .net wpf vb.net

同样的问题:WPF ContextMenu with ItemsSource - how to bind to Command in each item?

我尝试按照以下方式实施,但没有骰子。

目前在我的XAML中有:

<DataGrid.ContextMenu>
            <ContextMenu ItemsSource="{Binding Users}">
                <ContextMenu.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=UID, Converter={StaticResource UserConverter}}"/>
                    </DataTemplate>
                </ContextMenu.ItemTemplate>
                <ContextMenu.ItemContainerStyle>
                    <Style TargetType="MenuItem">
                        <Setter Property="Command" Value="{Binding ReassignFileCommand}" />
                    </Style>
                </ContextMenu.ItemContainerStyle>
            </ContextMenu>
        </DataGrid.ContextMenu>

如果我使用命令,它会起作用:

            <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Woooo" Command="{Binding ReassignFileCommand}" />
            </ContextMenu>
        </DataGrid.ContextMenu>

需要更改为(解决方案):

<Setter Property="Command" Value="{Binding Path=DataContext.ReassignFileCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />

1 个答案:

答案 0 :(得分:1)

MenuItem的DataContext是来自Users集合的对应对象,而不是具有Users属性的对象,它是ContextMenu的DataContext。很可能您的命令是在ContextMenu datacontext类中实现的,因此WPF无法找到它。在调试模式下,可以在输出窗口中轻松找到此类绑定错误(http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or- Silverlight的application.aspx)

您可以通过将命令移动到用户类或更改绑定以指向正确的类(通过使用ElementName或RelativeSource绑定到contextMenu的datacontext)来解决此问题。

相关问题