首页 > 解决方案 > Wpf ContextMenu MenuItem 标题绑定

问题描述

我以这种方式在控件中定义了一个 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 对象的 ObservableCollection,我可以在输出窗口中看到在 CaseObject 中找不到 CurrentLang.CmenuItemUnLockUser,因此,问题与数据上下文有关...

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

谢谢!

标签: wpfbindingcontextmenudatacontext

解决方案


如果CurrentLang属性是在AdminViewModel类中定义的,则不能直接从DataGridRow. 那是因为DataContextof theDataGridRowCaseObject那个特定行的。

您可以做的是将 的Tag属性绑定DataGridRowAdminViewModel使用{RelativeSource}绑定:

<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的:AdminViewModelPlacementTargetContextMenu

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

推荐阅读