如何在UserControl上单击按钮来执行包含Window中的方法?

Ste*_*bob 8 vb.net wpf user-controls

我有一个UserControl,我们将其称为myUC,这是myWindow我的WPF应用程序的主窗口()中的几个UserControl之一. myUC包含许多标准控件,其中一个是按钮,我们称之为myButton.

当我点击时myButton,我想执行myMethod(),它存在于myWindow的代码隐藏中.

问题是,即使存在myUC也不知道myWindow,更不用说myMethod存在了.

我该如何发送消息:'嘿,myWindow,醒来.myUc上的myButton刚刚被点击; 请运行myMethod'?

Ale*_*x B 8

您可以在窗口中创建命令,并将按钮的Command属性设置为此命令的名称.单击该按钮将触发该命令,而无需引用父窗口.

本教程非常清楚地解释了一切.

  • 我从"The Wayback Machine"互联网档案中挖出了这篇文章.当网站不再存在且文章内容太多而无法包含在内时,不确定最好是避免链接断开.https://web.archive.org/web/20121102095816/http://www.switchonthecode.com/tutorials/wpf-tutorial-command-bindings-and-custom-commands (2认同)

Ste*_*bob 5

我实际上最终不得不在VB中做什么:

为我的自定义命令创建一个新的公共类,因为不希望我的MainWindow类为Public:

Public Class Commands
  Public Shared myCmd As New RoutedCommand
End Class
Run Code Online (Sandbox Code Playgroud)

创建运行所需代码的Execute和CanExecute方法.这两个方法是在MainWindow代码后面创建的:

Class MainWindow

Private Sub myCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
  e.CanExecute = True
  e.Handled = True
End Sub

Private Sub myCmdExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
  //Do stuff here...
  e.Handled = True
End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

在MainWindow代码隐藏中创建Command绑定,并将两个处理程序方法添加到绑定(这是C#和VB之间完全不同的部分):

Class MainWindow
 Public Sub New()
      // This call is required by the designer.
      InitializeComponent()
      //Add any initialization after the InitializeComponent() call.
      //Create command bindings.
      Dim cb As New CommandBinding(Commands.myCmd)
      AddHandler cb.CanExecute, AddressOf myCmdCanExecute
      AddHandler cb.Executed, AddressOf myCmdExecuted
      Me.CommandBindings.Add(cb)
 End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

将新的自定义命令添加到UserControl上的按钮对象.使用自定义命令,这在XAML中似乎不可能,因此我必须在代码隐藏中执行此操作.Commands类必须是Public,因此可以在此UserControl中访问命令:

Public Class myUserControl
  Public Sub New()
    //This call is required by the designer.
    InitializeComponent()
    // Add any initialization after the InitializeComponent() call.
    myButton.Command = Commands.myCmd
  End Sub
End Class
Run Code Online (Sandbox Code Playgroud)