2013-03-25 50 views
3

我無法找到如何從子控件的資源部分訪問我的Window.Resources。我在子控件被定義一個DataTemplate,並希望這樣的DataTemplate綁定到一個ICommand我的視圖模型(在Window.Resources定義)WPF:無法從子控件訪問靜態資源

編輯:我說我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> 
    ... 

兒童控制

<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綁定是試圖綁定到任務對象。但是,我的ICommand位於ViewModel(ProjectsViewModel)中。我試圖將綁定更改爲Command="{Binding NewProjectCommand, Source={StaticResource ProjectsViewModel}},但是這會引發異常。

我在做什麼錯?

感謝,

+0

您的_ChildControl_是UserControl還是CustomControl? – DHN 2013-03-25 07:46:06

+0

我的控件是用戶控件 - 基本上在我的主窗口中爲其中一個窗格保留了一個TreeView。 – Scott 2013-03-25 17:04:53

+0

進行編輯以顯示如何在XAML中實例化ProjectsViewModel。 – Scott 2013-03-25 20:49:21

回答

4

你的DataTemplate看起來是在一個ItemsControl使用(如列表框),所以你說Command="{Binding NewProjectCommand}"將試圖綁定到Task類型的屬性,而你真的想綁定到父容器的屬性。因此,您需要使用的RelativeSource約束力的,是這樣的:

Command="{Binding Path=DataContext.NewProjectCommand, RelativeSource= 
     {RelativeSource FindAncestor, AncestorType={x:Type views:ProjectsView}}}" 
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}}}"