我目前在项目中遇到问题,我将主视图模型的绑定传递到了上下文菜单。
第一次打开上下文菜单(显然使用鼠标右键)会给我这个错误
System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“ TextBlock”(名称=“)”上找不到'(attached:DependencyObjectAttached.DataContextEx)'属性。 BindingExpression:Path = PlacementTarget。(附加:DependencyObjectAttached.DataContextEx).QuotationCommandProcessor.ConvertProductCommand; DataItem ='ContextMenu'(Name ='');目标元素是'MenuItem'(Name ='');目标属性为“命令”(类型为“ ICommand”)
由于绑定第二次打开上下文菜单成功,所以这可能并不重要,但是像我以前的OCD一样,我希望解决此问题。
这就是我所拥有的
我使用的实现是通过这样的附加属性
的<DataGrid ItemSource="{Binding MyItemSources}">
<DataGrid.Columns>
<DataGridTemplateColumn CellTemplate="{StaticResource MyCellStyle}"/>
<DataGrid.Columns>
</DataGrid>
样式看起来像这样
<DataTemplate x:Key="MyCellStyle">
<TextBlock Text="{Binding}" attached:DependencyObjectAttached.DataContextEx="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type local:MyPage}}}">
<TextBlock.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Click Here To Run Command" Command="{Binding PlacementTarget.(attached:DependencyObjectAttached.DataContextEx).CommandFromTheViewModel, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" CommandParameter="{Binding}"/>
</ContextMenu>
<TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
DependencyObjectAttached.DataContextEx
attached:DependencyObjectAttached.DataContextEx
是用于将viewmodel传递到上下文菜单的附加属性
我已经尝试使用放置目标的标签(文本块),并且工作正常,但是,我将标签用于其他目的,因此附加属性是我能想到的唯一选择。有什么建议吗?
答案 0 :(得分:1)
请尝试以下代码,以实现对主窗口或Page的数据上下文的访问。
技巧不是创建一个DataTemplate而是直接将ContextMenu创建为资源,然后将该上下文菜单用于DataGridCell,如下所示。
<Window.Resources>
<ContextMenu x:Key="ContextMenu1">
<ContextMenu.Items>
<MenuItem Header="{Binding DataContext.Title,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window} }"/>
<MenuItem Header="{Binding DataContext.Title,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
<MenuItem Header="{Binding DataContext.Title,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" />
</ContextMenu.Items>
</ContextMenu>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding VentingTypesCollection}">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="ContextMenu" Value="{StaticResource ContextMenu1}" />
</Style>
</DataGrid.CellStyle>
</DataGrid>
</Grid>
请记住,DataContext.Title属性是我的视图模型中的一个简单字符串属性。
我认为,一旦实现了对数据上下文的访问,从viewmodel绑定任何内容将非常简单。 希望对您有帮助。