我有一个这样在控件中定义的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
发布评论