2013-07-26 84 views
0

我想設置我的上下文菜單的Datacontext - 但我的代碼不起作用。非常類似的代碼在另一個位置工作,所以如果有人能解釋爲什麼它不起作用,我將不勝感激。Wpf Treeview上下文菜單DataContext

我的Treeview看起來像這樣: 注意:它比較長,但我認爲嵌套結構是問題的一部分,所以我想縮小它。 問題發生在ppChart綁定的第二個「級別」上。

<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只是拋出一個異常,它無法找到方法存在的目標viewmodel上的方法。 –

回答

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。

反正你應該結束了類似下面的代碼:

<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

你好Sniffer,請原諒我很晚的迴應 - 在此期間,我有一些非常優先考慮的任務。 我從你的答案開始,我在另一個視圖中使用的答案完美無缺 - 但在這種情況下,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> 

注意Ancestertype TreeView的是如何使用的。我敢打賭,它會走向Visual樹直到找到具有適當DataContect的Treeview。 感謝嗅探器,它做得非常好!