Wpf ContextMenu MenuItem标题绑定(Wpf ContextMenu MenuItem Header Binding)

编程入门 行业动态 更新时间:2024-10-28 11:31:08
Wpf ContextMenu MenuItem标题绑定(Wpf ContextMenu MenuItem Header Binding)

我有一个这样在控件中定义的ContextMenu ...

<Controls:MetroWindow.Resources> <ContextMenu x:Key="RowContextMenu"> <MenuItem Header="{Binding CurrentLang.CmenuItemUnLockUser}"/> </ContextMenu>

CurrentLang.CmenuItemUnLockUser是一个字符串。

DataContext在xaml(和working ...)中定义:

<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,所以,问题与datacontext有关...

我怎样才能指定正确的datacontext?

谢谢!

I have a ContextMenu defined in a control this way...

<Controls:MetroWindow.Resources> <ContextMenu x:Key="RowContextMenu"> <MenuItem Header="{Binding CurrentLang.CmenuItemUnLockUser}"/> </ContextMenu>

CurrentLang.CmenuItemUnLockUser is a string.

The DataContext is defined in the xaml (and working...):

<Controls:MetroWindow.DataContext> <admin:AdminViewModel/> </Controls:MetroWindow.DataContext>

The BlockedUserContextMenu is used in a DataGrid and defined as:

<DataGrid x:Name="DgridCases" ItemsSource="{Binding CasesCollection" ...> <DataGrid.RowStyle> <Style TargetType="{x:Type DataGridRow}"> <Setter Property="ContextMenu" Value="{StaticResource RowContextMenu}" /> </Style> </DataGrid.RowStyle>

CasesCollection is an ObservableCollection of CaseObject objects, i can see in the output window that can't found CurrentLang.CmenuItemUnLockUser in the CaseObject, so, the issue is related to the datacontext...

How can i specify the right datacontext?

Thanks!

最满意答案

如果CurrentLang属性在AdminViewModel类中定义,则不能直接从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>

If the CurrentLang property is defined in the AdminViewModel class, you can't bind to it directly from the DataGridRow. That's because the DataContext of the DataGridRow is the CaseObject for that particular row.

What you could do is to bind the Tag property of the DataGridRow to the AdminViewModel using a {RelativeSource} binding:

<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>

...and then bind to the CurrentLang of the AdminViewModel using the PlacementTarget property of the ContextMenu:

<ContextMenu x:Key="RowContextMenu"> <MenuItem Header="{Binding PlacementTarget.Tag.CurrentLang.CmenuItemUnLockUser, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/> </ContextMenu>

更多推荐

CurrentLang,CmenuItemUnLockUser,电脑培训,计算机培训,IT培训"/> <meta name=&qu

本文发布于:2023-07-26 03:43:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1270666.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:绑定   标题   ContextMenu   Wpf   MenuItem

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!