我无法找到如何从子控件的Resource部分中访问我的Window.Resources。我在子控件中定义了一个DataTemplate,并希望DataTemplate绑定到我的视图模型上的ICommand(在Window.Resources中定义)
编辑:我将RadPaneGroup
代码添加到主窗口XAML。这是我实例化ProjectsViewModel
对象的地方。 ProjectsView
中包含的RadDocumentPane
控件是我在下面列出的Child Control。
主窗口
<Window.Resources>
<viewModels:ProjectsViewModel x:Key="ProjectsViewModel" />
</Window.Resources>
<telerik:RadDocking HasDocumentHost="False" >
<telerik:RadSplitContainer>
<telerik:RadPaneGroup DataContext="{StaticResource ProjectsViewModel}">
<telerik:RadDocumentPane Header="Projects">
<views:ProjectsView/>
</telerik:RadDocumentPane>
</telerik:RadPaneGroup>
</telerik:RadSplitContainer>
...
儿童控制
<Control.Resources>
<!--Data template for the Task object-->
<DataTemplate DataType="{x:Type models:Task}">
<StackPanel>
<TextBlock Text="{Binding DisplayName}" Foreground="Red"
FontSize="16" FontFamily="Verdana" />
<telerik:RadContextMenu.ContextMenu>
<telerik:RadContextMenu >
<telerik:RadMenuItem Header="New Project"
Command="{Binding NewProjectCommand}"/>
</telerik:RadContextMenu>
</telerik:RadContextMenu.ContextMenu>
</StackPanel>
</DataTemplate>
上述XAML上的绑定试图绑定到Task对象。但是,我的ICommand位于ViewModel(ProjectsViewModel)中。我试图将绑定更改为Command="{Binding NewProjectCommand, Source={StaticResource ProjectsViewModel}}
,但这会引发异常。
我做错了什么?
谢谢,
答案 0 :(得分:4)
您的DataTemplate看起来像是在ItemsControl(例如ListBox)中使用,因此您说Command="{Binding NewProjectCommand}"
将尝试绑定到Task
类型的属性,而您真的想要绑定到父容器的属性。因此,您需要使用RelativeSource绑定,例如:
Command="{Binding Path=DataContext.NewProjectCommand, RelativeSource=
{RelativeSource FindAncestor, AncestorType={x:Type views:ProjectsView}}}"
答案 1 :(得分:1)
您可以在Why can't I use DataContext={Binding} for my context menu?处使用与问题类似的方法来解决此问题。
这可能不起作用的基本原因是ContextMenu在技术上是一个单独的窗口,因此它拥有自己的可视树,并且可能不包含在文档窗格的逻辑树中。因此,它不知道如何从包含视图中查找资源。
DataContext="{Binding PlacementTarget.DataContext.NewProjectCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type telerik:RadContextMenu}}}"