Nasıl yapılır: ICommandSource Uygulama
Bu örnekte uygulayarak bir komut kaynağının nasıl oluşturulacağı gösterilmektedir ICommandSource. Komut kaynağı, komutun nasıl çağrıldığını bilen bir nesnedir. ICommandSource Arabirim üç üyeyi kullanıma sunar:
- Command: çağrılacak komut.
- CommandParameter: komut kaynağından komutu işleyen yönteme geçirilen kullanıcı tanımlı veri türü.
- CommandTarget: komutun yürütülmekte olduğu nesne.
Bu örnekte, denetimden Slider devralan ve arabirimini uygulayan ICommandSource bir sınıf oluşturulur.
Örnek
WPF, , MenuItemve Hyperlinkgibi Buttonuygulayan ICommandSourcebir dizi sınıf sağlar. Komut kaynağı, komutu nasıl çağırılacağını tanımlar. Bu sınıflar tıklandığında bir komut çağırır ve yalnızca özellikleri Command ayarlandığında bir komut kaynağı olurlar.
Bu örnekte, kaydırıcı taşındığında veya özellik değiştirildiğinde Value daha doğru bir şekilde komutunu çağıracaksınız.
Sınıf tanımı aşağıdadır:
public class CommandSlider : Slider, ICommandSource
{
public CommandSlider() : base()
{
}
Public Class CommandSlider
Inherits Slider
Implements ICommandSource
Public Sub New()
MyBase.New()
End Sub
Sonraki adım üyeleri uygulamaktır ICommandSource . Bu örnekte, özellikler nesne olarak DependencyProperty uygulanır. Bu, özelliklerin veri bağlamayı kullanmasını sağlar. sınıfı hakkında DependencyProperty daha fazla bilgi için bkz. Bağımlılık Özelliklerine Genel Bakış. Veri bağlama hakkında daha fazla bilgi için bkz. Veri Bağlamaya Genel Bakış.
Command Burada yalnızca özelliği gösterilir.
// Make Command a dependency property so it can use databinding.
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register(
"Command",
typeof(ICommand),
typeof(CommandSlider),
new PropertyMetadata((ICommand)null,
new PropertyChangedCallback(CommandChanged)));
public ICommand Command
{
get
{
return (ICommand)GetValue(CommandProperty);
}
set
{
SetValue(CommandProperty, value);
}
}
' 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
Değişiklik geri çağırması DependencyProperty aşağıdadır:
// Command dependency property change callback.
private static void CommandChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
CommandSlider cs = (CommandSlider)d;
cs.HookUpCommand((ICommand)e.OldValue,(ICommand)e.NewValue);
}
' Command dependency property change callback.
Private Shared Sub CommandChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
Dim cs As CommandSlider = CType(d, CommandSlider)
cs.HookUpCommand(CType(e.OldValue, ICommand), CType(e.NewValue, ICommand))
End Sub
Sonraki adım, komut kaynağıyla ilişkili komutu eklemek ve kaldırmaktır. Command Yeni bir komut eklendiğinde özelliğin üzerine yazılamaz, çünkü varsa, önceki komutla ilişkili olay işleyicilerinin önce kaldırılması gerekir.
// Add a new command to the Command Property.
private void HookUpCommand(ICommand oldCommand, ICommand newCommand)
{
// If oldCommand is not null, then we need to remove the handlers.
if (oldCommand != null)
{
RemoveCommand(oldCommand, newCommand);
}
AddCommand(oldCommand, newCommand);
}
// Remove an old command from the Command Property.
private void RemoveCommand(ICommand oldCommand, ICommand newCommand)
{
EventHandler handler = CanExecuteChanged;
oldCommand.CanExecuteChanged -= handler;
}
// Add the command.
private void AddCommand(ICommand oldCommand, ICommand newCommand)
{
EventHandler handler = new EventHandler(CanExecuteChanged);
canExecuteChangedHandler = handler;
if (newCommand != null)
{
newCommand.CanExecuteChanged += canExecuteChangedHandler;
}
}
' 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
Sonraki adım işleyici için mantık oluşturmaktır CanExecuteChanged .
Olay, CanExecuteChanged komut kaynağına komutun geçerli komut hedefinde yürütülebilme özelliğinin değişmiş olabileceğini bildirir. Bir komut kaynağı bu olayı aldığında genellikle komutunda CanExecute yöntemini çağırır. Komut geçerli komut hedefinde yürütülemezse, komut kaynağı genellikle kendisini devre dışı bırakır. Komut geçerli komut hedefinde yürütülebiliyorsa, komut kaynağı genellikle kendisini etkinleştirir.
private void CanExecuteChanged(object sender, EventArgs e)
{
if (this.Command != null)
{
RoutedCommand command = this.Command as RoutedCommand;
// If a RoutedCommand.
if (command != null)
{
if (command.CanExecute(CommandParameter, CommandTarget))
{
this.IsEnabled = true;
}
else
{
this.IsEnabled = false;
}
}
// If a not RoutedCommand.
else
{
if (Command.CanExecute(CommandParameter))
{
this.IsEnabled = true;
}
else
{
this.IsEnabled = false;
}
}
}
}
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
Son adım yöntemidir Execute . Komutu bir RoutedCommandRoutedCommand Execute ise yöntemi çağrılır; aksi takdirde ICommand Execute yöntemi çağrılır.
// If Command is defined, moving the slider will invoke the command;
// Otherwise, the slider will behave normally.
protected override void OnValueChanged(double oldValue, double newValue)
{
base.OnValueChanged(oldValue, newValue);
if (this.Command != null)
{
RoutedCommand command = Command as RoutedCommand;
if (command != null)
{
command.Execute(CommandParameter, CommandTarget);
}
else
{
((ICommand)Command).Execute(CommandParameter);
}
}
}
' 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
Ayrıca bkz.
.NET Desktop feedback