0

我正在尝试设置上下文菜单的数据上下文 - 但我的代码不起作用。非常相似的代码在另一个位置工作,所以如果有人能解释为什么它不起作用,我将不胜感激。

我的 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>
4

3 回答 3

2

我认为您的问题恰恰在于这行代码:

cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.AddEntityCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"

要修复它,您需要将其更改为:

cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.AddEntityCommand, RelativeSource={RelativeSource Self}}"

但仅此一项并不能解决您的问题,因为操作消息的目标将是没有设置其 Tag 属性的 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>

我最近回答了一个类似的问题,您可以查看更多详细信息。

于 2013-07-26T15:06:37.047 回答
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>

请注意如何使用祖先类型树视图。我敢打赌,它会遍历 Visual 树,直到找到具有正确 DataContect 的 Treeview。感谢 Sniffer,它做得非常好!

于 2013-07-31T11:45:57.010 回答
0

ToolTip 或 ContextMenu 中的 RelativeSource 绑定所述,无需将标记添加到 PlacementTarget。这使它更短,因为不需要向控件和 ContextMenu 的绑定路径添加标签,例如:

<TextBlock FontSize="14" Text="{Binding Path=ShapeName}" VerticalAlignment="Center">
    <TextBlock.ContextMenu>
        <ContextMenu cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
            <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>

在 ViewModel 中

public void DeleteLink(object parameter)
{
    if (parameter == null)
        return;
    var param = parameter as YourDataContextType;
    if (! (param is YourDataContextType))
        return;

    // your delete handling
}
于 2020-05-25T20:10:59.570 回答