2015-05-07 6 views
1

Я немного потерялся с привязками. Я пробовал столько всего за последний час, я не могу перечислить их всех. У меня проблема с contextMenu внутри DataTemplate.Как связать команду с ContextMenu в DataTemplate

Чтобы пояснить: У меня есть UserControl. Его dataContext сам по себе. Внутри этого UserControl у меня есть элемент ItemsControl для представления списка гиперссылок. Мой ItemsControlitemsSource связан (он состоит из элементов объектов). Я переопределил ItemsControl.ItemTemplate. Внутри я создаю HyperLink, с TextBlock как ребенок, чтобы он работал, и на этом TextBlock я установил ContextMenu, выполнив следующее.

<TextBlock.ContextMenu> 
    <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}"> 
    <MenuItem Header="Enregistrer la pièce jointe" Foreground="Black"> 
     <MenuItem Header="Dans le dossier patient" Command="{Binding DataContext.SaveAttachmentIntPatientFolderCommand, RelativeSource={RelativeSource AncestorType=UserControl}}" CommandParameter="{Binding FilePath}" Foreground="Black" /> 
     <MenuItem Header="Enregistrer sous ..." Command="{Binding DataContext.SaveAttachmentAsCommand}" CommandParameter="{Binding FilePath}" Foreground="Black" /> 
    </MenuItem> 
    </ContextMenu> 
</TextBlock.ContextMenu> 

Так что я

UserControl --> ItemsControl --> ItemTemplate --> HyperLink --> TextBlock --> ContextMenu --> ContextMenuItem 

Я знаю, что мой первый родственник источник не работает, у меня есть ошибки связывания. То, что я хочу, это привязать к моему UserContorl datacontext, которые имеют эти команды.

Как я могу продолжить?

Благодаря

ответ

4

ContextMenu принимает DataContext от ItemsControl и поэтому он не может получить доступ к ViewModel непосредственно. Также он не является частью VisualTree, поэтому вы не можете выполнять привязку RelativeSource. Поэтому нам нужно получить DataContext свойства UserControl через тег TextBlock, а затем привязать его к ContextMenu. Вы указываете приведенный ниже код.

<TextBlock Text="{Binding }" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}"> 
          <TextBlock.ContextMenu> 
           <ContextMenu > 
            <MenuItem Header="Enregistrer la pièce jointe" Foreground="Black"> 
             <MenuItem Header="Dans le dossier patient" Command="{Binding Path=PlacementTarget.Tag.SaveAttachmentIntPatientFolderCommand, 
              RelativeSource={RelativeSource AncestorType=ContextMenu}}"             
                Foreground="Black" /> 
             <MenuItem Header="Enregistrer sous ..." Command="{Binding Path=PlacementTarget.Tag.SaveAttachmentAsCommand, 
              RelativeSource={RelativeSource AncestorType=ContextMenu}}" 
                Foreground="Black" /> 
            </MenuItem> 
           </ContextMenu> 
          </TextBlock.ContextMenu> 
         </TextBlock>  
+0

Действительно умный! Большое спасибо – cdie

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