2013-07-16 81 views
1

TreeView ContextMenu未觸發事件(ContextMenu已打開的事件未觸發),我正在嘗試Caliburn.Micro.Telerik約定未解決的問題。TreeView ContextMenu未觸發事件

TreeViewItemTemplate

<HierarchicalDataTemplate x:Key="TreeViewItemTemplate" ItemsSource="{Binding Types}" 
    ItemTemplateSelector="{StaticResource NamespaceItemTemplateSelector}"> 
<StackPanel Orientation="Horizontal"> 
    <Path 
      Data="" 
      Height="11.458" Margin="0,0,5,0" RenderTransformOrigin="0.5,0.5" Stretch="Fill" 
      UseLayoutRounding="False" Width="11.264"> 
     <Path.Fill> 
      <SolidColorBrush Color="#FF333333"> 
       <SolidColorBrush.RelativeTransform> 
        <MatrixTransform Matrix="Identity" /> 
       </SolidColorBrush.RelativeTransform> 
       <SolidColorBrush.Transform> 
        <MatrixTransform Matrix="Identity" /> 
       </SolidColorBrush.Transform> 
      </SolidColorBrush> 
     </Path.Fill> 
     <Path.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform /> 
       <SkewTransform /> 
       <RotateTransform /> 
       <TranslateTransform /> 
      </TransformGroup> 
     </Path.RenderTransform> 
    </Path> 
    <TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"> 
    <TextBlock.ContextMenu> 
<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}" cal:Message.Attach="[Event Opened] = [Action Opened($dataContext)]" > 
     <MenuItem Header="NewChild" cal:Message.Attach="NewChild($datacontext)"/> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
    </TextBlock> 
</StackPanel> 

的TreeView

<TreeView x:Name="TreeView" ItemTemplate="{StaticResource TreeViewItemTemplate}" ItemsSource="{Binding Source}"/> 
+0

您的事件沒有觸發或Caliburn.Micro的約定不與您的上下文菜單一起工作的問題? –

+0

感謝您的回覆,Caliburn.Micro約定有效,但ContextMenu和MenuItem事件未觸發。 – Cipher

+0

@Sniffer它沒有任何解決方案?如果你想上傳項目。請幫幫我。謝謝。 – Cipher

回答

4

之前,我告訴你是什麼問題,我想指出的是您上傳的代碼版本與您在問題中發佈的內容有點不同。

OK,問題在於究竟在模板中的這一部分:

<TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"> 
    <TextBlock.ContextMenu> 
     <ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}" cal:Message.Attach="[Event Opened] = [Action Opened($dataContext)]" > 
      <MenuItem Header="NewChild" cal:Message.Attach="NewChild($datacontext)"/> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

要解決它,你需要用這個修改的版本替換它:

<TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}"> 
    <TextBlock.ContextMenu> 
     <ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Tag}" cal:Message.Attach="[Event Opened] = [Action ContextMenuOpened($source)]"> 
      <MenuItem Header="New" cal:Message.Attach="[Event Click] = [Action ClickMenuItem($source)]"/> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

的問題所致三個問題:

  1. 在模板中,特別是在這行代碼<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}"Path=UIElement.Tag正在導致綁定錯誤,因爲ContextMenu類型上沒有屬性,名爲UIElement。相反,您必須用代表打開上下文菜單的用戶界面中的元素的PlacementTarget屬性替換它。
  2. 第二個問題是您將處理這些事件的方法放在錯誤的類上。他們不應該在ShellViewModel上,因爲在模板中,您將Action.Target設置爲TextBlock後面的DataContext,實際上這是NamespaceViewModel,所以方法應該在NamespaceViewModel上。
  3. 第三個也是最後一個問題是你的方法有錯誤的簽名,所以它們不能被Caliburn.Micro找到。我的意思是,你可以聲明你ContextMenuOpened方法是這樣的:void ContextMenuOpened(sender args, RoutedEventArgs args);,但在模板中,你在呼喚這樣的方法:[Action ContextMenuOpened($source)]發送該方法引發該事件ContextMenu在這種情況下)FrameworkElement,所以你應該將此事件的方法簽名更改爲:void ContextMenuOpened(ContextMenu source)或更一般的void ContextMenuOpened(FrameworkElement source)

摘要:

  1. 解決您的模板使用PlacementTarget屬性。
  2. 將您的方法移至NamespaceViewModel
  3. 修復您的方法簽名。

最後:如果您想了解動作和動作的消息,一切都得到傳承什麼,那麼你真的應該瞭解Actions文檔維基什麼參數。

+0

解決了我的問題,謝謝你的詳細解釋。祝你好運。 – Cipher

+0

@SteveQueen不客氣。 –

+1

謝謝你的回答。我無法弄清楚爲什麼它不起作用。我現在可以清楚地看到。 –