簡體   English   中英

獲取父級的ContextMenu數據上下文

[英]Get ContextMenu Datacontext of Parent

我有一個ContextMenu綁定到CommandBinding:

<MetroTreeView:MetroTreeView x:Name="tvTagList" Grid.Row="1" Margin="15, 0, 15, 0" SelectedItemChanged="tvTagList_SelectedTagChanged" ItemsSource="{Binding}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="{x:Null}" BorderBrush="{DynamicResource ExtryzeAccentBrushSecondary}" BorderThickness="2" Foreground="White"
    VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard">
<MetroTreeView:MetroTreeView.Resources>
    <HierarchicalDataTemplate DataType="{x:Type  DataBind:TagClass}" ItemsSource="{Binding Children}" >
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
            <TextBlock>
                <Run Text="{Binding TagClassMagic}" />
                <Run Foreground="{StaticResource TextBrushSecondary}" Text=" - " />
                <Run Foreground="{StaticResource TextBrushSecondary}" Text="{Binding Path=Description, Converter={StaticResource IValueTagDescriptionCleanup}}" />
            </TextBlock>
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Dump Tag List..." Click="DumpClassTagList" />
                </ContextMenu>
            </StackPanel.ContextMenu>
        </StackPanel>
    </HierarchicalDataTemplate>
    <DataTemplate DataType="{x:Type DataBind:TagEntry}">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
            <StackPanel.ContextMenu>
                <ContextMenu>
                    <ContextMenu.CommandBindings>
                        <CommandBinding Command="{x:Static DataBind:HaloMap.CommandTagBookmarking }"
                                            CanExecute="CommandTagBookmarking_CanExecute"
                                            Executed="CommandTagBookmarking_Executed"
                                            />
                    </ContextMenu.CommandBindings>
                    <MenuItem Header="Bookmark Tag" Foreground="White" Command="{x:Static DataBind:HaloMap.CommandTagBookmarking}" CommandParameter="{Binding}" />
                </ContextMenu>
            </StackPanel.ContextMenu>
            <TextBlock Text="{Binding TagFileName}" />
        </StackPanel>
    </DataTemplate>
</MetroTreeView:MetroTreeView.Resources>
<MetroTreeView:MetroTreeView.ItemContainerStyle>
    <Style TargetType="{x:Type MetroTreeView:MetroTreeViewItem}" BasedOn="{StaticResource {x:Type MetroTreeView:MetroTreeViewItem}}">
        <EventSetter Event="MouseDoubleClick" Handler="tvTagList_ItemDoubleClick" />
    </Style>
</MetroTreeView:MetroTreeView.ItemContainerStyle>

但是,當我運行CanExecute命令時,每次訪問DataContext的嘗試總是會遇到一個null:

private void CommandTagBookmarking_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    var a = e.Source;
    var b = ((MenuItem)a).DataContext;
    var c = ((ContextMenu) ((MenuItem) e.Source).Parent).DataContext;
}

嘗試這個:

<ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">

由於ContextMenu不在放置對象的VisualTree中。 您必須使用PlacementTarget繼承對象的DataContext

<ContextMenu DataContext="{Binding PlacementTarget.DataContext,
                                   RelativeSource={RelativeSource Self}}">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM