1

我有一个 TreeViewItem 的 HierarchicalDataTemplate,在模板中我有一个 contextmenu,我想将 ContextMenu 父级作为 CommandParameter 传递 - 即此时右键单击的 TreeViewItem 所有者,有没有办法做到这一点?这是我的模板:

    <HierarchicalDataTemplate 
    x:Key="ServerTemplate"
    DataType="{x:Type models:Server}" 
    ItemsSource="{Binding Channels}"
    ItemTemplate="{StaticResource ChannelTemplate}">
    <StackPanel
        Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"
        Orientation="Horizontal">
        <StackPanel.ContextMenu>
            <ContextMenu
                FontSize="14"
                FontFamily="Arial">
                <MenuItem 
                    Header="{x:Static p:Resources.ServerOperations_CommunicationSettings}"
                    Command="{Binding PlacementTarget.Tag.ServerCommunicationSettingCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContextMenu}}}"
                    CommandParameter="{Binding Path=Parent, RelativeSource={RelativeSource Mode=Self}}">
                </MenuItem>

            </ContextMenu>
        </StackPanel.ContextMenu>
        <Image 
            Source="{Binding ImageURL, Converter={StaticResource StringToImageConverter}}"
            Margin="0,0,2,0"
            Height="25"
            Width="25"/>
        <TextBlock 
            Text="{Binding ServerName}"
            Foreground="White"/>
    </StackPanel>
</HierarchicalDataTemplate>

谢谢您的帮助

4

1 回答 1

3

您可以通过获取PlacementTarget of ContextMenuwhich will beStackPanel和 its TemplatedParentwill beContentPresenter以及 its TemplatedParentwill be来获取 TreeViewItem TreeViewItem。所以这将起作用:

CommandParameter="{Binding Path=PlacementTarget.TemplatedParent.TemplatedParent, 
                           RelativeSource={RelativeSource Mode=FindAncestor,
                                            AncestorType={x:Type ContextMenu}}}"

PlacementTarget (StackPanel) --> TemplatedParent (ContentPresenter) --> TemplatedParent (TreeViewItem)


理想情况下,将 UI 组件传递给 ViewModel并不是一个好主意。您应该传递数据,即 TreeViewItem 的 DataContext,因为您可以随时使用它。

如果你想传递TreeviewItem 的Server实例DataContext,你可以简单地做,"{Binding}"因为 MenuItem 将从 StackPanel 继承它。

CommandParameter="{Binding}"
于 2014-03-17T07:40:37.880 回答