Könnten Sie bitte ein Beispiel geben, wie Sie die ICommandSource
Schnittstelle implementieren. Wie ich meine UserControl
, die nicht die Fähigkeit hat, Befehl in Xaml angeben, um diese Fähigkeit zu haben. Und um den Befehl zu handhaben, wenn der Benutzer auf CustomControl
klickt.In WPF wie implementiere ich ICommandSource, um meine benutzerdefinierte Kontrollmöglichkeit zu geben, Command von Xaml zu verwenden?
9
A
Antwort
18
Hier ist ein Beispiel:
public partial class MyUserControl : UserControl, ICommandSource
{
public MyUserControl()
{
InitializeComponent();
}
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(MyUserControl), new UIPropertyMetadata(null));
public object CommandParameter
{
get { return (object)GetValue(CommandParameterProperty); }
set { SetValue(CommandParameterProperty, value); }
}
// Using a DependencyProperty as the backing store for CommandParameter. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandParameterProperty =
DependencyProperty.Register("CommandParameter", typeof(object), typeof(MyUserControl), new UIPropertyMetadata(null));
public IInputElement CommandTarget
{
get { return (IInputElement)GetValue(CommandTargetProperty); }
set { SetValue(CommandTargetProperty, value); }
}
// Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandTargetProperty =
DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(MyUserControl), new UIPropertyMetadata(null));
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonUp(e);
var command = Command;
var parameter = CommandParameter;
var target = CommandTarget;
var routedCmd = command as RoutedCommand;
if (routedCmd != null && routedCmd.CanExecute(parameter, target))
{
routedCmd.Execute(parameter, target);
}
else if (command != null && command.CanExecute(parameter))
{
command.Execute(parameter);
}
}
}
Beachten Sie, dass die CommandTarget
Eigenschaft nur für RoutedCommands
verwendet wird
0
Ihr UserControl wird einen Code hinter der Datei cs oder vb haben, Sie müssen die Schnittstelle ICommandSource implementieren, und sobald Sie dies implementieren, müssen Sie in einigen Fällen tatsächlich den Befehl aufrufen und auch CanExecute überprüfen.
+1, schönes Beispiel – Mizipzor
gutes Beispiel! Vielen Dank! – Vitalij