菜单单击不触发其绑定命令 [英] Menu click not firing its bound command

查看:78
本文介绍了菜单单击不触发其绑定命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从以下视图开始:

<Window x:Class="MyApp.UI.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp.UI.Views"
        mc:Ignorable="d"
        Title="MyApp" Height="300" Width="500" WindowStartupLocation="CenterScreen">
  <Grid>
    <Button
      HorizontalAlignment="Left"
      VerticalAlignment="Top"
      Command="{Binding ShutdownCommand}"
      Content="_Exit" 
      Margin="390,225,0,0"
      Width="75"/>
  </Grid>
</Window>

代码隐藏

Imports MyApp.UI.ViewModels

Namespace MyApp.UI.Views
  Public Class MainView
    Public Sub New(ViewModel As IMainViewModel)
      Me.InitializeComponent()

      Me.ViewModel = ViewModel
      Me.DataContext = Me.ViewModel
    End Sub

    Private Sub MainView_Loaded(Sender As MainView, e As RoutedEventArgs) Handles Me.Loaded
      Me.ViewModel.Load
    End Sub

    Private ReadOnly ViewModel As MainViewModel
  End Class
End Namespace

ViewModel

Imports MyApp.UI.Commands

Namespace MyApp.UI.ViewModels
  Public Class MainViewModel
    Implements IMainViewModel

    Public Sub New()
      Me.ShutdownCommand = New DelegateCommand(AddressOf Me.Shutdown)
    End Sub

    Public Sub Shutdown() Implements IMainViewModel.Shutdown
      Application.Current.Shutdown()
    End Sub

    Public Sub Load() Implements IMainViewModel.Load
    End Sub

    Public ReadOnly Property ShutdownCommand As ICommand
  End Class
End Namespace

DelegateCommand

Imports Intexx

Namespace MyApp.UI.Commands
  Public Class DelegateCommand
    Implements ICommand

    Public Sub New(Execute As Action(Of Object))
      Me.New(Execute, Nothing)
    End Sub

    Public Sub New(Execute As Action(Of Object), CanExecute As Func(Of Object, Boolean))
      If Execute.IsNothing Then
        Throw New ArgumentNullException(NameOf(Execute))
      Else
        Me._CanExecute = CanExecute
        Me._Execute = Execute
      End If
    End Sub

    Public Function CanExecute(Parameter As Object) As Boolean Implements ICommand.CanExecute
      Return Me._CanExecute.IsNothing OrElse Me._CanExecute(Parameter)
    End Function

    Public Sub Execute(Parameter As Object) Implements ICommand.Execute
      Me._Execute(Parameter)
    End Sub

    Public Sub RaiseCanExecuteChanged()
      RaiseEvent CanExecuteChanged(Me, EventArgs.Empty)
    End Sub

    Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged

    Private ReadOnly _CanExecute As Func(Of Object, Boolean)
    Private ReadOnly _Execute As Action(Of Object)
  End Class
End Namespace

单击退出按钮将按预期工作。

Clicking the Exit button works as expected. The application exits.

然后我添加了一个菜单:

Then I added a menu:

<Window x:Class="MyApp.UI.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp.UI.Views"
        mc:Ignorable="d"
        Title="MyApp" Height="300" Width="500" WindowStartupLocation="CenterScreen">
  <Grid>
    <Menu>
      <MenuItem Header="_File">
        <MenuItem
          Header="E_xit"
          Command="{Binding ShutDownCommand}"/>
      </MenuItem>
      <MenuItem Header="_Help">
        <MenuItem Header="_About MyApp"/>
      </MenuItem>
    </Menu>
    <Button
      HorizontalAlignment="Left"
      VerticalAlignment="Top"
      Command="{Binding ShutdownCommand}"
      Content="_Exit" 
      Margin="390,225,0,0"
      Width="75"/>
  </Grid>
</Window>

单击 Exit 按钮仍然有效,但是单击 File =>退出不产生结果。我没有在代码隐藏或ViewModel中进行任何更改。

Clicking the Exit button still works, but clicking File=>Exit produces no result. I didn't change anything in either my code-behind or my ViewModel.

这一个是相关的,但不完全相同。我的 MenuItem 是绑定的命令,是孩子,而不是父项。

This one is related, but not quite the same. My MenuItem with the bound command is the child, not the parent.

我在这里缺少什么?为什么 File => Exit 单击不单击绑定的命令?

What am I missing here? Why doesn't a File=>Exit click call the bound command?

推荐答案

好,知道了。

对WPF有点陌生,我忘记了命令绑定(除其他外)区分大小写。

Being a bit new to WPF, I'd forgotten that command bindings (among other things) are case sensitive.

当我将 MenuItem 的命令绑定从 ShutDownCommand 更改为 ShutdownCommand ,它可以工作。该应用程序将按预期退出。

When I change the MenuItem's command binding from ShutDownCommand to ShutdownCommand, it works. The application exits as expected.

如果IntelliSense在这里工作,那就太好了。

It'd be nice if IntelliSense worked here.

这篇关于菜单单击不触发其绑定命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆