2013-07-26 17 views
0

Я пытаюсь установить Datacontext моего Contextmenu, но мой код не работает. Очень похожий код работает в другом месте, поэтому я был бы признателен, если бы кто-нибудь мог объяснить, почему он не работает.Wpf Treeview Contextmenu DataContext

My Treeview выглядит так: Остерегайтесь: он довольно длинный, но я думаю, что вложенная структура является частью проблемы, поэтому я хочу ее сжать. Проблема возникает во втором «уровне» в ppChart Binding.

<TreeView x:Name ="Presentation_SlidesWithIndex" Grid.ColumnSpan="1" HorizontalAlignment="stretch" Height="auto" Margin="0,0,3,0" VerticalAlignment="stretch" Width="auto" Tag="{Binding DataContext, ElementName=LayoutRoot}"> 
     <TreeView.ItemContainerStyle> 
      <!--expand Charts when they contain elements--> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="IsExpanded" Value="{Binding HasCharts}"/> 
      </Style> 
     </TreeView.ItemContainerStyle> 

     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type pp:PPSlide}" ItemsSource="{Binding Charts}"> 
       <StackPanel x:Name="PPSlideElements" Orientation="Horizontal"> 
        <StackPanel.Style> 
         <Style TargetType="{x:Type StackPanel}"> 
          <Style.Triggers> 
           <!--Trigger for Slides with Charts--> 
           <DataTrigger Binding="{Binding Path=HasCharts}" Value="True" > 
            <Setter Property="Background" Value="LightBlue" /> 
           </DataTrigger> 
           <!--Trigger for Slides with NO Charts--> 
           <DataTrigger Binding="{Binding Path=HasCharts}" Value="False" > 
            <Setter Property="Opacity" Value=".5" /> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </StackPanel.Style> 
        <TextBlock FontSize="15"> 
         <Run Text="Slide "></Run> 
         <Run Text="{Binding Path=Index}"></Run> 
        </TextBlock> 
        <!--<Image Source="/Images/pptIcon.png" Height="10"></Image>--> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type pp:PPChart}" ItemsSource="{Binding ExcelSource}"> 
       <StackPanel x:Name="PpChartElements" Orientation="Horizontal" AllowDrop="True" cal:Message.Attach="[Event Drop] = [Action DropItem($eventArgs,$view)]" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}"> 
        <StackPanel.Style> 
         <Style TargetType="{x:Type StackPanel}"> 
          <Style.Triggers> 
           <!--Trigger for Charts with DataSource set--> 
           <DataTrigger Binding="{Binding Path=HasDataSourceSet}" Value="True" > 
            <Setter Property="Background" Value="LightGreen" /> 
           </DataTrigger> 
           <!--Trigger for Charts with DataSource nit set--> 
           <DataTrigger Binding="{Binding Path=HasDataSourceSet}" Value="False" > 
            <Setter Property="Background" Value="Orange" /> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </StackPanel.Style> 
        <Image Source="{Binding ChartType, Converter={StaticResource PowerPointChartTypeConverter}}" Width="19" Height="19" Margin="2,2,4,2"></Image> 
        <TextBlock FontSize="14" Text="{Binding Path=ShapeName}" VerticalAlignment="Center"> 
         <TextBlock.ContextMenu> 
          <ContextMenu cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.AddEntityCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"> 
           <MenuItem Header="Löse Verknüpfung" cal:Message.Attach="DeleteLink($datacontext)" ToolTip="Löscht einen bestehenden Link zu einer Excel Datei"/> 
          </ContextMenu> 
         </TextBlock.ContextMenu> 
        </TextBlock> 
        <Image Source="{Binding PowerPointWriteStatus, Converter={StaticResource PowerPointWriteStatusConverter}}" Width="19" Height="19" Margin="2,2,4,2" ToolTip="Zeigt erfolg oder misserfolg des Erstellens an"></Image> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type pp:PPSourceExcelLink}"> 
       <StackPanel x:Name="PpSourceExcelLinkStackPanel" Orientation="Vertical"> 
        <TextBlock FontSize="14"> 
         <Run Text="Datei: "></Run> 
         <Run Text="{Binding Path=ExcelFileName, Mode=OneWay}"></Run> 
        </TextBlock> 
        <TextBlock FontSize="14"> 
         <Run Text="Tabelle: "></Run> 
         <Run Text="{Binding Path=SourceTableID}"></Run> 
        </TextBlock> 
       </StackPanel> 
      </HierarchicalDataTemplate> 

     </TreeView.Resources> 
    </TreeView> 
+0

Когда вы говорите: «Мой код не работает», что вы точно имеете в виду? – Nitesh

+0

@Nitesh Caliburn.Micro просто генерирует исключение, которое не может найти метод в целевой модели, где существуют методы. –

ответ

2

Я думаю, ваша проблема заключается именно в этой строке кода:

cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.AddEntityCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" 

Чтобы исправить это вам нужно изменить это:

cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.AddEntityCommand, RelativeSource={RelativeSource Self}}" 

, но это само по себе не исправит ваша проблема, потому что целью сообщения о действии будет TextBlock, который не имеет установленного свойства Tag.

В любом случае вы должны в конечном итоге с кодом, аналогичным образом:

<TextBlock FontSize="14" Text="{Binding Path=ShapeName}" VerticalAlignment="Center" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"> 
    <TextBlock.ContextMenu> 
     <ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Tag}"> 
      <MenuItem Header="Löse Verknüpfung" cal:Message.Attach="DeleteLink($datacontext)" ToolTip="Löscht einen bestehenden Link zu einer Excel Datei" /> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

Я ответил similar question недавно, и вы можете посмотреть на для более подробной информации.

+0

Привет, Снейфер, пожалуйста, извините мой очень поздний ответ - у меня были некоторые очень приоритетные задачи, брошенные на меня тем временем. Я начал с вашего ответа, который я использую в другом представлении, где ответ работает отлично, но в этом контексте caliburn.micro просто генерирует исключение, которое не может найти метод DeleteLink. –

+0

@ChristianSauer убедитесь, что метод 'DeleteLink' имеет правильную подпись, т. Е. В качестве параметра требуется объект типа $ datacontext и убедиться, что он расположен на нужном объекте. Поскольку CM говорит вам, что он не может найти метод, проблема должна быть одной из вышеперечисленных проблем. –

+0

Метод имеет подпись DeleteLink (объект DataContext) - это работает и в другой View/Viewmodel. CM не говорит мне, у какой ViewModel есть проблема, поэтому я предполагаю, что она не находит правильный ViewModel. –

0

Я нашел решение, которое работает довольно хорошо - но почему это работает за мной:

<TextBlock FontSize="14" Text="{Binding Path=ShapeName}" VerticalAlignment="Center" Tag="{Binding DataContext, RelativeSource={AncestorType=TreeView}}"> 
    <TextBlock.ContextMenu> 
     <ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Tag}"> 
      <MenuItem Header="Löse Verknüpfung" cal:Message.Attach="DeleteLink($datacontext)" ToolTip="Löscht einen bestehenden Link zu einer Excel Datei" /> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

Обратите внимание, как используется TreeView Ancestertype. моя догадка заключается в том, что он ходит по дереву Visual, пока не найдет Treeview, у которого есть соответствующий DataContect. Благодаря Sniffer, который сделал очень хорошую работу!

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