2013-03-25 2 views
3

Я не могу узнать, как получить доступ к моим Window.Resources изнутри раздела ресурсов дочернего элемента управления. У меня есть DataTemplate определяется в контроле за ребенком, и хотим, чтобы DataTemplate связываться с ICommand на моей модели представления (определенный в Window.Resources)WPF: невозможно получить доступ к статическому ресурсу из дочернего элемента управления

EDIT: Я добавил мой 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

Является ли ваш _ChildControl_ 'UserControl' или' CustomControl'? – DHN

+0

Мой элемент управления - UserControl - в основном содержит TreeView для одной из панелей в моем главном окне. – Scott

+0

Сделано редактирование, чтобы показать, как экземпляр ProjectsViewModel создается в XAML. – Scott

ответ

4

Ваш DataTemplate выглядит, как он используется в ItemsControl (например, ListBox), так как вы говорите, 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}}}" 

 Смежные вопросы

  • Нет связанных вопросов^_^