Wpf ContextMenu MenuItem Header 绑定

Wpf ContextMenu MenuItem Header Binding

我在控件中以这种方式定义了一个 ContextMenu...

<Controls:MetroWindow.Resources>

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

CurrentLang.CmenuItemUnLockUser 是一个字符串。

DataContext 在 xaml 中定义(正在工作...):

<Controls:MetroWindow.DataContext>
    <admin:AdminViewModel/>
</Controls:MetroWindow.DataContext>

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 objects 的 ObservableCollection,我可以在输出 window 中看到在 CaseObject 中找不到 CurrentLang.CmenuItemUnLockUser,因此,问题与数据上下文...

如何指定正确的数据上下文?

谢谢!

如果 CurrentLang 属性 在 AdminViewModel class 中定义,您不能直接从 DataGridRow 绑定到它。那是因为 DataGridRowDataContext 是该特定行的 CaseObject

您可以使用 {RelativeSource} 绑定将 DataGridRowTag 属性 绑定到 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>

...然后使用 ContextMenuPlacementTarget 属性 绑定到 AdminViewModelCurrentLang:

<ContextMenu x:Key="RowContextMenu">
    <MenuItem Header="{Binding PlacementTarget.Tag.CurrentLang.CmenuItemUnLockUser, 
                RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>