Wpf上下文菜单菜单项头绑定
我在控件中定义了一个ContextMenuWpf上下文菜单菜单项头绑定,wpf,binding,contextmenu,datacontext,Wpf,Binding,Contextmenu,Datacontext,我在控件中定义了一个ContextMenu <Controls:MetroWindow.Resources> <ContextMenu x:Key="RowContextMenu"> <MenuItem Header="{Binding CurrentLang.CmenuItemUnLockUser}"/> </ContextMenu> CurrentLang.CmenuItemUnL
<Controls:MetroWindow.Resources>
<ContextMenu x:Key="RowContextMenu">
<MenuItem Header="{Binding CurrentLang.CmenuItemUnLockUser}"/>
</ContextMenu>
CurrentLang.CmenuItemUnLockUser是一个字符串
DataContext在xaml(和工作…)中定义:
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,因此,问题与datacontext有关
如何指定正确的datacontext
谢谢 如果
CurrentLang
属性是在AdminViewModel
类中定义的,则不能直接从DataGridRow
绑定到它。这是因为DataGridRow
的DataContext
是该特定行的case对象
您可以使用{RelativeSource}
绑定将DataGridRow
的标记
属性绑定到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>
如果CurrentLang
属性是在AdminViewModel
类中定义的,则不能直接从DataGridRow
绑定到它。这是因为DataGridRow
的DataContext
是该特定行的case对象
您可以使用{RelativeSource}
绑定将DataGridRow
的标记
属性绑定到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>
它可以像一样简单吗?CurrentLang属性是在哪里定义的?在AdminViewModel类或CaseObject类中?@DonBoitnott,不,它不起作用。。。谢谢@mm8 CurrentLang是在AdminViewModel中定义的,谢谢!它可以像一样简单吗?CurrentLang属性是在哪里定义的?在AdminViewModel类或CaseObject类中?@DonBoitnott,不,它不起作用。。。谢谢@mm8 CurrentLang是在AdminViewModel中定义的,谢谢!真聪明!我通常认为标签是一个字符串,但它是一个对象。。。谢谢真聪明!我通常认为标签是一个字符串,但它是一个对象。。。谢谢
<ContextMenu x:Key="RowContextMenu">
<MenuItem Header="{Binding PlacementTarget.Tag.CurrentLang.CmenuItemUnLockUser,
RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>