【问题标题】:Get ContextMenu Datacontext of Parent获取父级的 ContextMenu Datacontext
【发布时间】:2013-03-15 20:43:17
【问题描述】:

我有一个绑定到 CommandBinding 的 ContextMenu:

<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 的尝试总是遇到一个空值:

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;
}

【问题讨论】:

    标签: c# wpf data-binding contextmenu


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 不,“var c = ((ContextMenu) ((MenuItem) e.Source).Parent).DataContext;”仍然返回 null。
    • @AlexReed 我建议你使用Snoop 来检查正在运行的应用程序,看看差距在哪里。
    • Snoop 甚至不承认我的应用程序正在运行。
    • @AlexReed 这不可能。您正在编译哪个 .Net 版本?
    • .NET 4.0,在 Visual Studio 2012 中
    【解决方案2】:

    由于ContextMenu 不要位于放置它的对象的VisualTree 中。您必须使用PlacementTarget 继承对象的DataContext -

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

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      相关资源
      最近更新 更多