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
绑定到它。那是因为 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>
我在控件中以这种方式定义了一个 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
绑定到它。那是因为 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>