【问题标题】:WPF Contextmenu itemtemplate commandParameter binding returns nullWPF 上下文菜单项模板命令参数绑定返回 null
【发布时间】:2015-03-12 22:36:14
【问题描述】:

我有问题。我正在尝试在 wpf 中创建一个带有数据绑定的上下文菜单。上下文菜单项将绑定到可观察的对象集合。上下文菜单的数量很好 - 但是,我想向它添加命令。

我的使用方式是:

在 XAML 中

 <Grid.Resources>
            <local:RestoreCommand x:Key="RestoreCommand" />
            <local:ShowBalloonCommand x:Key="BaloonCommand" />
            <local:StartTaskCommand x:Key="StartTaskCommand" />
        </Grid.Resources>

<ContextMenu ItemsSource="{Binding}" Name="taskBarContextMenu">
                    <ContextMenu.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                            <Setter Property="Command" Value="{StaticResource StartTaskCommand}"/>
                            <Setter Property="CommandParameter" Value="{Binding mainWindow}"/>
                        </Style>
                    </ContextMenu.ItemContainerStyle>

<TextBlock TextWrapping="Wrap" Text="{Binding Name}" Grid.Column="0"/>
                                    <TextBlock TextWrapping="Wrap" Text="{Binding TimeElapsed, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Column="2"/>

在 C# 中:

taskbarIcon.ContextMenu.ItemsSource = TasksList;

我有一个命令类

public class StartTaskCommand : ICommand
    {
        public void Execute(object parameter)
        {
            //THE PARAMETER IS ALWAYS NULL
            var window = parameter as MainWindow;
            if (window != null)
            {

            }
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;
    } 

我为其他两个命令设置了类似的设置,它工作正常。我尝试添加的任何参数始终为空 - 无论是 taskBarContextMenu,还是 mainWindow 或 menuItem... 欢迎任何想法。

====

我按照建议尝试了以下解决方案,但命令参数仍然为空:

 <tb:TaskbarIcon Name="taskbarIcon"
            DoubleClickCommand="{StaticResource RestoreCommand}"
            DoubleClickCommandParameter="{Binding ElementName=mainWindow}"

            LeftClickCommand="{StaticResource BaloonCommand}"
            LeftClickCommandParameter="{Binding ElementName=mainWindow}"
            IconSource=".\256px-Out_of_date_clock_icon.ico"
                        MenuActivation="RightClick"
                        Tag="{Binding ElementName=mainWindow}"
                        >



<tb:TaskbarIcon.ContextMenu ><ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" Tag="{Binding}" Name="taskBarContextMenu">
            <ContextMenu.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{StaticResource StartTaskCommand}"/>
                    <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.DataContext}"/>
                </Style>
            </ContextMenu.ItemContainerStyle>

【问题讨论】:

    标签: c# wpf xaml contextmenu


    【解决方案1】:

    您需要在菜单的容器中添加一个标签,并使用放置目标绑定到它。

    查看此示例:

    <StackPanel x:Key="ConfigurationListItem" x:Shared="False" Tag="{Binding ElementName=UserControl}">
            <StackPanel Orientation="Horizontal">
                <Button>
                    <Button.InputBindings>
                        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding ElementName=UserControl, Path=LaunchCommand}" CommandParameter="{Binding}" />
                        <MouseBinding Gesture="LeftClick" Command="{Binding ElementName=UserControl, Path=SelectCommand}" CommandParameter="{Binding}" />
                    </Button.InputBindings>
            </StackPanel>
    
            <StackPanel.ContextMenu>
                <ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" Tag="{Binding}">
                    <MenuItem Header="Sync Environment Dependencies" 
                            Command="{Binding Parent.PlacementTarget.Tag.SyncEnvironmentCommand, RelativeSource={RelativeSource Self}}"
                            CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.DataContext}" />
                </ContextMenu>
            </StackPanel.ContextMenu>
        </StackPanel>
    

    【讨论】:

    • 不,不幸的是,这仍然是一个空参数值......我已经更新了我的代码以显示我根据您的示例所做的操作
    • 你是否将它绑定到一个propper元素名称?例如,我的窗口分配了一个名称 (x:Name = "UserControl")
    • 查看我提供的 stackpanel 标签绑定。
    • 是的,我的窗口有一个名字——mainWindow。我已将Tag="{Binding ElementName=mainWindow}" 添加到上下文菜单的父级,但参数仍然为空:((
    • “主窗口”分配给哪个属性(x:Name 或 x:Class)?
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多