Wpf上下文菜单菜单项头绑定

Wpf上下文菜单菜单项头绑定,wpf,binding,contextmenu,datacontext,Wpf,Binding,Contextmenu,Datacontext,我在控件中定义了一个ContextMenu <Controls:MetroWindow.Resources> <ContextMenu x:Key="RowContextMenu"> <MenuItem Header="{Binding CurrentLang.CmenuItemUnLockUser}"/> </ContextMenu> CurrentLang.CmenuItemUnL

我在控件中定义了一个ContextMenu

<Controls:MetroWindow.Resources>

    <ContextMenu x:Key="RowContextMenu">
        <MenuItem Header="{Binding CurrentLang.CmenuItemUnLockUser}"/>            
    </ContextMenu>

CurrentLang.CmenuItemUnLockUser是一个字符串

DataContext在xaml(和工作…)中定义:


BlockedUserContextMenu在DataGrid中使用,定义为:

<DataGrid x:Name="DgridCases"
          ItemsSource="{Binding CasesCollection"
          ...>
                <DataGrid.RowStyle>
                    <Style TargetType="{x:Type DataGridRow}">
                        <Setter Property="ContextMenu" Value="{StaticResource RowContextMenu}" />
                    </Style>
                </DataGrid.RowStyle>

CasesCollection是CaseObject对象的ObservableCollection,我可以在输出窗口中看到,在CaseObject中找不到CurrentLang.CmenuItemUnLockUser,因此,问题与datacontext有关

如何指定正确的datacontext


谢谢

如果
CurrentLang
属性是在
AdminViewModel
类中定义的,则不能直接从
DataGridRow
绑定到它。这是因为
DataGridRow
DataContext
是该特定行的
case对象

您可以使用
{RelativeSource}
绑定将
DataGridRow
标记
属性绑定到
AdminViewModel

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Tag" Value="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window}}" />
        <Setter Property="ContextMenu" Value="{StaticResource RowContextMenu}" />
    </Style>
</DataGrid.RowStyle>

如果
CurrentLang
属性是在
AdminViewModel
类中定义的,则不能直接从
DataGridRow
绑定到它。这是因为
DataGridRow
DataContext
是该特定行的
case对象

您可以使用
{RelativeSource}
绑定将
DataGridRow
标记
属性绑定到
AdminViewModel

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Tag" Value="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window}}" />
        <Setter Property="ContextMenu" Value="{StaticResource RowContextMenu}" />
    </Style>
</DataGrid.RowStyle>

它可以像
一样简单吗?CurrentLang属性是在哪里定义的?在AdminViewModel类或CaseObject类中?@DonBoitnott,不,它不起作用。。。谢谢@mm8 CurrentLang是在AdminViewModel中定义的,谢谢!它可以像
一样简单吗?CurrentLang属性是在哪里定义的?在AdminViewModel类或CaseObject类中?@DonBoitnott,不,它不起作用。。。谢谢@mm8 CurrentLang是在AdminViewModel中定义的,谢谢!真聪明!我通常认为标签是一个字符串,但它是一个对象。。。谢谢真聪明!我通常认为标签是一个字符串,但它是一个对象。。。谢谢
<ContextMenu x:Key="RowContextMenu">
    <MenuItem Header="{Binding PlacementTarget.Tag.CurrentLang.CmenuItemUnLockUser, 
                RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>