WPF 上下文菜单菜单项标头绑定



我以这种方式在控件中定义了一个上下文菜单...

<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绑定到它。这是因为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>

最新更新