赵玉~想要一个定所 2023-08-02 22:40 采纳率: 50%
浏览 38
已结题

WPF MVVM ListViewItem的ContextMenu不响应CommandBase事件

问题描述

C# WPF MVVM ListViewItem的ContextMenu的MenuItem中Command绑定的CommandBase事件无响应。

代码逻辑描述

创建了一个MainWindow,在MainWindow中间划定一块区域用以绑定显示其他的View界面;
我在一个View(MonitorView)中创了一个ListView,每一个Items都有几个操作,我将这几个操作定义在了ContextMenu中,当鼠标右击时就显示ContextMenu,点击MenuItem执行对应的操作;

<!-- ContextMenu  -->>
   <ContextMenu x:Key="ContextMenu1">
                        <MenuItem   Header="出厂" FontSize="14" >
                            <MenuItem Header="下行" FontSize="14" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl},Path=DataContext.DownOutTrainCommand}" 
                                                       CommandParameter="{Binding}"/>
                            <Separator/>
                            <MenuItem Header="上行" FontSize="14"/>
                        </MenuItem>
                        <Separator/>
                        <MenuItem Header="去15" FontSize="14" Command="{Binding DataContext.DownOutTrainCommand,RelativeSource={RelativeSource AncestorType={x:Type local:MonitorView}}}" 
                                                       CommandParameter="{Binding }"/>
                        <MenuItem Header="去14" FontSize="14" Command="{Binding RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=UserControl},Path=DataContext.DownOutTrainCommand}" 
                                                       CommandParameter="{Binding}"  />
                        <MenuItem Header="去13" FontSize="14"  Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.DownOutTrainCommand}" 
                                                       CommandParameter="{Binding}" />
                    </ContextMenu>

ListViewItem 的 ItemContainerStyle的样式

                    <Style x:Key="ListItemType" TargetType="{x:Type ListViewItem}">
                        <Setter Property="Margin" Value="2,10,2,0"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>

                                    <Border  BorderThickness="1" CornerRadius="5" x:Name="borderground"  >
                                        <Border.Background>
                                            <ImageBrush ImageSource="pack://application:,,,/huainan_railway;component/Assets/Image/train.png" Stretch="UniformToFill"/>
                                        </Border.Background>
                                        <Border.Effect>
                                            <DropShadowEffect Color="#FF1F0F0B" BlurRadius="10" Opacity="0.5"></DropShadowEffect>
                                        </Border.Effect>
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <RowDefinition Height="*" />
                                                <RowDefinition Height="4*"/>
                                            </Grid.RowDefinitions>
                                            <Border Grid.Row="0" Background="#2c6cf3" Width="18" Height="18" CornerRadius="9" Margin="2,0,3,-7" BorderBrush="White" BorderThickness="1" HorizontalAlignment="Left">
                                                <TextBlock Text="{Binding StockIndex}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="16" Foreground="White"/>
                                            </Border>
                                            <Border Grid.Row="1" Margin="5,0"  Background="Transparent" Name="root" BorderThickness="0,0,0,1" CornerRadius="6">
                                                <Grid>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition/>
                                                        <ColumnDefinition/>
                                                    </Grid.ColumnDefinitions>
                                                    <TextBlock Text="{Binding MachineType}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="16" Foreground="#FF17FF00" FontWeight="Bold"/>
                                                    <TextBlock Grid.Column="1" Text="{Binding TrainNumber}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="16" Foreground="#FF17FF00" FontWeight="Bold"/>
                                                </Grid>
                                            </Border>
                                        </Grid>
                                    </Border>

                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="ContextMenu" Value="{StaticResource ContextMenu1}"/>
                        <Setter Property="ToolTip" Value="{Binding Source={StaticResource ItempInfoTip}}"/>
                    </Style>

ListView 调用

 <ListView  ItemsSource="{Binding trainsSolid.trains5}"  Background="Transparent"  
                       BorderThickness="1,1,1,1"  Style="{StaticResource ListBorderBrush}" 
                       ItemContainerStyle="{StaticResource ListItemType}"
                       Height="55" Width="461" Canvas.Top="610" Canvas.Left="743">
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
            </ListView>

ViewModel中的事件

 //出车 下行
        private CommandBase _downOutTrainCommand;
        public CommandBase DownOutTrainCommand
        {
            get
            {
                if (_downOutTrainCommand == null)
                {
                    _downOutTrainCommand = new CommandBase();
                    _downOutTrainCommand.DoExecute = new Action<object>(obj =>
                    {
                        try
                        {
                            TrainModel trainModel = (TrainModel)obj;
                            //TrainPlanModel trainPlanModel = (TrainPlanModel)obj;
                            //monitorService.UpdatePlanState(3, trainPlanModel.ID);
                            //trainPlanModel.Status = 3;
                            //ObservableCollection<TrainModel> tM = trainsSolid.GetObservable(trainPlanModel.Stock);
                            //monitorService.insertTrain(trainPlanModel, tM);
                            Initialize();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    });
                }
                return _downOutTrainCommand;
            }
        }

img

分析

要明确指定数据源 无法通过继承拿到? 但是不知道怎么写;加载ViewModel? 尝试了不行,不知道怎么回事;

                <<ResourceDictionary >
                    <vm:MonitorViewModel x:Key="mvm"/>
                </ResourceDictionary>
<UserControl.DataContext>
        <Binding Source="{StaticResource mvm}"/>
    </UserControl.DataContext>

    <UserControl.ContextMenu>
        <ContextMenu DataContext="{StaticResource mvm}"/>
    </UserControl.ContextMenu>
  • 写回答

9条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-03 09:22
    关注
    获得1.95元问题酬金

    【以下回答由 ChatGPT 生成】

    我很抱歉,但是你没有给出具体的问题。请提供问题后,我将尽力给出相应的解决方案。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 系统已结题 8月10日
  • 创建了问题 8月2日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀