WPF:无法从子控件访问静态资源

3
我无法找到如何从子控件的资源部分访问我的Window.Resources。我在子控件中定义了一个DataTemplate,并希望该DataTemplate绑定到我的视图模型(在Window.Resources中定义)上的ICommand。
编辑:我将我的RadPaneGroup代码添加到主窗口XAML中。这是我实例化ProjectsViewModel对象的地方。包含在RadDocumentPane中的ProjectsView控件是我下面列出的子控件。
主窗口
<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>
    ...

Child Control

<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}},但这会引发异常。
我做错了什么?
谢谢,

你的_ChildControl_是一个UserControl还是一个CustomControl - DHN
我的控件是一个UserControl - 基本上在我的主窗口中的一个面板中包含了一个TreeView。 - Scott
进行了一次编辑,以展示如何在XAML中实例化ProjectsViewModel。 - Scott
抛出了什么类型的异常? - DHN
2个回答

4

你的DataTemplate看起来像是在ItemsControl(例如ListBox)中使用,所以正如你所说,Command="{Binding NewProjectCommand}" 将尝试绑定到 Task 类型的属性,而你实际上想要绑定到父容器的属性。因此,你需要使用一个RelativeSource绑定,例如:

Command="{Binding Path=DataContext.NewProjectCommand, RelativeSource=
         {RelativeSource FindAncestor, AncestorType={x:Type views:ProjectsView}}}" 

1
你可以尝试使用类似于 为什么不能将DataContext={Binding}用于右键菜单? 的方法来解决这个问题。基本原因是ContextMenu在技术上是一个单独的窗口,因此它有自己的可视化树,在文档窗格的逻辑树中可能不包含它自己。因此,它不知道如何从包含的视图中查找资源。
 DataContext="{Binding PlacementTarget.DataContext.NewProjectCommand,
               RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type telerik:RadContextMenu}}}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接