菜单单击未触发其绑定命令
Menu click not firing its bound command
我从这个视图开始:
<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>
Code-behind
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
单击 Exit
按钮按预期工作。应用程序退出。
然后我添加了一个菜单:
<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=>Exit
没有任何结果。我没有在我的 code-behind 或我的 ViewModel 中进行任何更改。
This one相关,但不完全相同。我的 MenuItem
与绑定命令是 child,而不是 parent。
我在这里错过了什么?为什么 File=>Exit
单击不调用绑定命令?
好的,明白了。
作为 WPF 的新手,我忘记了命令绑定(除其他事项外)区分大小写。
当我将 MenuItem
的命令绑定从 ShutDownCommand
更改为 ShutdownCommand
时,它起作用了。应用程序按预期退出。
要是 IntelliSense 能在这里工作就好了。
我从这个视图开始:
<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>
Code-behind
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
单击 Exit
按钮按预期工作。应用程序退出。
然后我添加了一个菜单:
<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=>Exit
没有任何结果。我没有在我的 code-behind 或我的 ViewModel 中进行任何更改。
This one相关,但不完全相同。我的 MenuItem
与绑定命令是 child,而不是 parent。
我在这里错过了什么?为什么 File=>Exit
单击不调用绑定命令?
好的,明白了。
作为 WPF 的新手,我忘记了命令绑定(除其他事项外)区分大小写。
当我将 MenuItem
的命令绑定从 ShutDownCommand
更改为 ShutdownCommand
时,它起作用了。应用程序按预期退出。
要是 IntelliSense 能在这里工作就好了。