wpf - ContextMenu.PlacementTarget没有设置,不知道为什么



xaml wpf-controls (2)

<DataTemplate x:Key="_ItemTemplateA">
  <Grid Tag="{Binding Path=DataContext.Command, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
      <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource ContentTemplateB}" Grid.Row="0" />
    <ContentControl Name="uiContentPresenter" Content="{Binding ContentView}" Grid.Row="1" Height="0" />
    <ContentControl DataContext="{Binding IsContentDisplayed}" DataContextChanged="IsDisplayed_Changed" Visibility="Collapsed" />
    <Grid.ContextMenu>
      <ContextMenu>
        <MenuItem Header="Text" 
              Command="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
              CommandParameter="{Binding}" />
      </ContextMenu>
    </Grid.ContextMenu>
  </Grid>
</DataTemplate>

上述数据模板应用于ItemsControl。 问题是,为网格指定的ContextMenu,PlacementTarget属性从来没有真正设置为任何东西,所以我不能到达网格的Tag属性,这是传递应该在父UserControl上执行的命令所必需的到上下文菜单。 我已经基于类似的例子,这样的方法: http : //social.msdn.microsoft.com/Forums/en-US/wpf/thread/0244fbb0-fd5f-4a03-bd7b-978d7cbe1be3/

我还没有找到任何其他的好方法来传递这个命令。 这是以这种方式设置的,因为我们使用的是MVVM方法,所以我们必须执行的命令存在于应用此模板的用户控件的视图模型中。我试着用几种不同的方式明确地设置PlacementTarget,但它仍然总是显示为未设置。

https://src-bin.com


Answer #1

以下是一个基于您的测试用例的独立工作的XAML示例:一个ContextMenu ,使用TagPlacementTargetDataContext中检索Command 。 您可以重新引入代码的一部分,直到停止工作,试图找出问题所在:

<Grid>
    <Grid.Resources>
        <PointCollection x:Key="sampleData">
            <Point X="10" Y="20"/>
            <Point X="30" Y="40"/>
        </PointCollection>
        <DataTemplate x:Key="_ItemTemplateA">
            <Grid Tag="{Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}}">
                <TextBlock Text="{Binding X}"/>
                <Grid.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" CommandParameter="{Binding}"/>
                    </ContextMenu>
                </Grid.ContextMenu>
            </Grid>
        </DataTemplate>
    </Grid.Resources>
    <DockPanel DataContext="{x:Static ApplicationCommands.Open}">
        <ListBox ItemTemplate="{StaticResource _ItemTemplateA}" ItemsSource="{StaticResource sampleData}"/>
    </DockPanel>
</Grid>

Answer #2

我们有同样的问题,但它是随机的。 控件模板中的一个上下文菜单,用于列表框的样式。 我们试图将contextmenu移动到模板中的不同级别,但同样的错误发生。

我们认为它可能会连接到我们的ICollectionView,这是ListBox的itemssource的刷新。

当PlacementTarget被设置之前,当视图刷新contextmenu中的相关源绑定时,它似乎正在被评估。

感觉就像是collectionviewsource或WPF的ContextMenu中的一个bug ...