我在使用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”创建“点击”。
更新
我已经更新了我的代码并按照建议实现了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))
MainWindow中的绑定:
所以基本上我知道编译器正在看东西,但是当我实际点击它时不会将它传递给sub。还有什么进一步的想法吗?
答案 0 :(得分:1)
如果出现这样的错误,您在代码中创建的方法签名是错误的,例如指定MouseEventArgs
而非通用RoutedEventArgs
。
除此之外,我发现这个XAML没有问题,如果绑定实际上绑定到一个命令,它不会做一些相当奇怪的事情它应该工作。按钮位于弹出窗口内的事实应该不是问题。
答案 1 :(得分:1)
按钮的Command属性应该绑定到对象集上的某些东西,作为实现ICommand接口的DataContext(如提到的H.B.)。
实现此目的的一种简单方法是使用包装类,其中包含ICommand实现的许多机制。这是关于MVVM的一篇很好的介绍性文章的a link,其中包含RelayCommand
类的实现。
整篇文章读起来很棒,但您可以跳到“中继命令逻辑”部分来查看实现。
希望有所帮助!