wpf - 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,因此,问题与数据上下文有关...
如何指定正确的数据上下文?
谢谢!
解决方案
如果CurrentLang
属性是在AdminViewModel
类中定义的,则不能直接从DataGridRow
. 那是因为DataContext
of theDataGridRow
是CaseObject
那个特定行的。
您可以做的是将 的Tag
属性绑定DataGridRow
到AdminViewModel
使用{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
的:AdminViewModel
PlacementTarget
ContextMenu
<ContextMenu x:Key="RowContextMenu">
<MenuItem Header="{Binding PlacementTarget.Tag.CurrentLang.CmenuItemUnLockUser,
RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>
推荐阅读
- javascript - 选择时如何从 datalist->option 元素中获取“rel”值?
- angular - 集成 polyfill 以使 Angular 与 Internet Explorer 兼容的正确方法是什么?
- pandas - 如何在pandas中获得v每列的百分比分布?
- eclipse - 自 Windows 10 更新 1809 和 gc.print() / gc.copyArea(
- angular - Angular - 将指令注入同一元素的其他指令
- php - Wordpress - 对自定义 php 脚本的 ajax 请求
- r - 如何识别 R 中的类似文档?
- android - 带有分页库的无尽 RecyclerView 中的 AdMob 广告
- jquery - 如何将 ajax 请求的数据发送回控制器?
- rx-java2 - 使用 RxJava 遍历 Vertx JsonArray