我以这种方式在控件中定义了一个上下文菜单...
<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 对象的可观察集合,我可以在输出窗口中看到在 CaseObject 中找不到 CurrentLang.CmenuItemUnLockUser,所以,问题与数据上下文有关......
如何指定正确的数据上下文?
谢谢!
如果在AdminViewModel
类中定义了CurrentLang
属性,则无法直接从DataGridRow
绑定到它。这是因为DataGridRow
的DataContext
是该特定行的CaseObject
。
您可以做的是使用{RelativeSource}
绑定将DataGridRow
的Tag
属性绑定到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>
。然后使用ContextMenu
的PlacementTarget
属性绑定到AdminViewModel
的CurrentLang
:
<ContextMenu x:Key="RowContextMenu">
<MenuItem Header="{Binding PlacementTarget.Tag.CurrentLang.CmenuItemUnLockUser,
RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>