我有一个自定义控件弹出与mouseenter事件。弹出窗口和按钮显示良好。当我单击该按钮时,控件冻结并且不启动命令。要解冻,我得把窗口最小化。
弹出代码如下:
<Popup Name="Popup_PrevButton"
PlacementTarget="{Binding ElementName=PART_Button}"
Placement="Left"
StaysOpen="False"
AllowsTransparency="True"
PopupAnimation="Fade"
Focusable="True">
<Grid>
<Button
Name="Button_PrevButton"
Margin="2,0,2,0"
Width="20"
Height="48"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Foreground="{TemplateBinding Foreground}"
Command="{Binding Path=Button_NextButton}">
</Button>
</Grid>
</Popup>
如果我使用Click=Button_NextButton,我会得到一个错误,说明:从文本"Button_NextButton"创建"Click"失败。
我已经更新了我的代码,并按照建议实现了RelayCommand类。我将绑定更改为
Command="{Binding Path=nCommand:CustomCommands.Button_Click}">
我确信我已经绑定了命令(通过改变东西,我打破了程序,所以它不会运行-例如:如果我删除sub,那么我得到一个sub不存在的错误),但是当我点击按钮时,同样的事情发生了。
按钮命令如下:
Private Sub ON_Button_Click(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
'Do something here
End Sub
nCommand代码:Public Shared Button_PrevButton_Click As New RoutedCommand("Button_PrevButton_Click", GetType(MainWindow))
在主窗口中绑定:
所以基本上我知道编译器看到的东西,但当我实际点击它不传递它的子。任何进一步的想法?
按钮的Command属性应该绑定到对象集上的某个东西,作为实现iccommand接口的DataContext(如H.B.所提到的)。
实现这一点的一个简单方法是使用包含iccommand实现的许多机制的包装器类。这里有一篇关于MVVM的介绍性文章的链接,其中包含RelayCommand
类的实现。
整篇文章读起来很棒,但是你可以直接跳到"中继命令逻辑"一节来查看实现。
希望有帮助!
如果你得到这样的错误,你在代码中创建的方法签名是错误的,例如指定MouseEventArgs
而不是通用的RoutedEventArgs
。
除此之外,我认为这一点XAML没有问题,如果绑定实际上绑定到一个不做一些相当奇怪的事情的命令,它应该工作。事实上,按钮是在一个弹出应该不是一个问题。