Defines an object that knows how to invoke a command.
Assembly: PresentationCore (in PresentationCore.dll)
Thetype exposes the following members.
A command source will normally disable itself if the command it is associated with cannot execute on the current command target. For example, a MenuItem associated with the Paste command will gray itself out when the Paste command cannot execute on the current command target.
Normally, a command source will listen to the CanExecuteChanged event on the command. This informs the command source when conditions change on the command target, such as loss of keyboard focus. The command source can then query the command using the CanExecute method.
In the Windows Presentation Foundation (WPF) commanding system, the CommandTarget property on a is only applicable when the ICommand is a RoutedCommand. If the CommandTarget is set on a and the corresponding command is not a RoutedCommand, the command target is ignored.
This example shows how to create a command source by implementing . A command source is an object that knows how to invoke a command. The interface exposes three members: Command, CommandParameter, and CommandTarget. Command is the command which will be invoked. The CommandParameter is a user-defined data type which is passed from the command source to the method which handles the command. The CommandTarget is the object that the command is being executed on.
In this example, a class is created which subclasses the Slider control and implements .
WPF provides a number of classes which implement , such as Button, MenuItem, and ListBoxItem. A command source defines how it invokes a command. Button and MenuItem invoke a command when they are clicked. A ListBoxItem invokes a command when it is double clicked. These classes only become a command source when their Command property is set.
For this example we will invoke the command when the slider is moved, or more accurately, when the Value property is changed.
The following is the class definition.
The next step is to implement the members. In this example, the properties are implemented as DependencyProperty objects. This enables the properties to use data binding. For more information about the DependencyProperty class, see the Dependency Properties Overview. For more information about data binding, see the Data Binding Overview.
Only the Command property is shown here.
' Make Command a dependency property so it can use databinding. Public Shared ReadOnly CommandProperty As DependencyProperty = DependencyProperty.Register("Command", GetType(ICommand), GetType(CommandSlider), New PropertyMetadata(CType(Nothing, ICommand), New PropertyChangedCallback(AddressOf CommandChanged))) Public ReadOnly Property Command1() As ICommand Implements ICommandSource.Command Get Return CType(GetValue(CommandProperty), ICommand) End Get End Property Public Property Command() As ICommand Get Return CType(GetValue(CommandProperty), ICommand) End Get Set(ByVal value As ICommand) SetValue(CommandProperty, value) End Set End Property
The following is the DependencyProperty change callback.
The next step is to add and remove the command which is associated with the command source. The Command property cannot simply be overwritten when a new command is added, because the event handlers associated with the previous command, if there was one, must be removed first.
' Add a new command to the Command Property. Private Sub HookUpCommand(ByVal oldCommand As ICommand, ByVal newCommand As ICommand) ' If oldCommand is not null, then we need to remove the handlers. If oldCommand IsNot Nothing Then RemoveCommand(oldCommand, newCommand) End If AddCommand(oldCommand, newCommand) End Sub ' Remove an old command from the Command Property. Private Sub RemoveCommand(ByVal oldCommand As ICommand, ByVal newCommand As ICommand) Dim handler As EventHandler = AddressOf CanExecuteChanged RemoveHandler oldCommand.CanExecuteChanged, handler End Sub ' Add the command. Private Sub AddCommand(ByVal oldCommand As ICommand, ByVal newCommand As ICommand) Dim handler As New EventHandler(AddressOf CanExecuteChanged) canExecuteChangedHandler = handler If newCommand IsNot Nothing Then AddHandler newCommand.CanExecuteChanged, canExecuteChangedHandler End If End Sub
The CanExecuteChanged event notifies the command source that the ability of the command to execute on the current command target may have changed. When a command source receives this event, it typically calls the CanExecute method on the command. If the command cannot execute on the current command target, the command source will typically disable itself. If the command can execute on the current command target, the command source will typically enable itself.
Private Sub CanExecuteChanged(ByVal sender As Object, ByVal e As EventArgs) If Me.Command IsNot Nothing Then Dim command As RoutedCommand = TryCast(Me.Command, RoutedCommand) ' If a RoutedCommand. If command IsNot Nothing Then If command.CanExecute(CommandParameter, CommandTarget) Then Me.IsEnabled = True Else Me.IsEnabled = False End If ' If a not RoutedCommand. Else If Me.Command.CanExecute(CommandParameter) Then Me.IsEnabled = True Else Me.IsEnabled = False End If End If End If End Sub
' If Command is defined, moving the slider will invoke the command; ' Otherwise, the slider will behave normally. Protected Overrides Sub OnValueChanged(ByVal oldValue As Double, ByVal newValue As Double) MyBase.OnValueChanged(oldValue, newValue) If Me.Command IsNot Nothing Then Dim command As RoutedCommand = TryCast(Me.Command, RoutedCommand) If command IsNot Nothing Then command.Execute(CommandParameter, CommandTarget) Else CType(Me.Command, ICommand).Execute(CommandParameter) End If End If End Sub
Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.