1

TreeView ContextMenu はイベントを発生させませんでした (ContextMenu Opened イベントは発生しません)。

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 x:Name="TreeView" ItemTemplate="{StaticResource TreeViewItemTemplate}" ItemsSource="{Binding Source}"/>
4

1 に答える 1

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>

この問題は、次の 3 つの問題によって引き起こされました。

  1. テンプレート、特にこのコード行では<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}"、と呼ばれるPath=UIElement.Tagタイプのプロパティがないため、バインディング エラーが発生していました。代わりに、コンテキスト メニューが開かれたユーザー インターフェイスの要素を表すプロパティに置き換える必要があります。ContextMenuUIElementPlacementTarget
  2. 2 つ目の問題は、これらのイベントを処理するメソッドを間違ったクラスに配置していたことです。ShellViewModelテンプレートでは、Action.Targetを のDataContext後ろに設定しているため、これTextBlockは実際のNamespaceViewModel状況では であるため、メソッドは に移動する必要がありNamespaceViewModelます。
  3. 最後の 3 番目の問題は、メソッドの署名が間違っていたため、Caliburn.Micro が検出できなかったことです。つまり、このようにメソッドを宣言しているということですContextMenuOpened:void ContextMenuOpened(sender args, RoutedEventArgs args);しかし、テンプレートでは、このようにメソッドを呼び出しています:これは、イベントを引き起こした[Action ContextMenuOpened($source)]メソッドを送信します(この場合)ので、このイベントのメソッド署名を変更する必要がありますこれに:またはより一般的な.FrameworkElementContextMenuvoid ContextMenuOpened(ContextMenu source)void ContextMenuOpened(FrameworkElement source)

概要:

  1. PlacementTargetプロパティを使用するようにテンプレートを修正してください。
  2. メソッドを に移動しますNamespaceViewModel
  3. メソッドのシグネチャを修正します。

最後に:アクションとアクション メッセージのすべてと、どのパラメータが何に渡されるかを知りたい場合は、Actionsに関するドキュメント wiki を実際に読む必要があります。

于 2013-07-18T10:19:04.927 に答える