有没有办法可以在我的控件的按钮(最终执行)中附加一个处理程序(回调),ICommand
以便我的控件知道命令执行何时完成?
问问题
1906 次
1 回答
1
您可以创建会引发回调方法的抽象 CallbackableCommand。
abstract class CallbackableCommand : ICommand
{
private IInputElement getRaisedElement()
{
return Keyboard.FocusedElement;
}
public void Execute(object parameter)
{
ExecuteImpl(parameter);
var element = getRaisedElement();
if(element == null) return;
//var ci = typeof(ExecutedRoutedEventArgs).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0];
//var routedEventArgs = (RoutedEventArgs)ci.Invoke(new object[] { this, parameter });
var routedEventArgs = new RoutedEventArgs();
//routedEventArgs.RoutedEvent = CommandManager.ExecutedEvent;
routedEventArgs.RoutedEvent = Callbackable.CommandExecutedEvent;
routedEventArgs.Source = element;
routedEventArgs.Handled = false;
element.RaiseEvent(routedEventArgs);
}
public abstract void ExecuteImpl(object parameter);
abstract public bool CanExecute(object parameter);
abstract public event EventHandler CanExecuteChanged;
}
从 CallbackableCommand 继承您的命令并覆盖 CanExecute、CanExecuteChanged 和 ExecuteImpl(而不是 Execute)
class SimpleCommand : CallbackableCommand
{
public override void ExecuteImpl(object parameter)
{
MessageBox.Show("Simple command execute with parameter: "
+ parameter ?? "null");
}
public override bool CanExecute(object parameter)
{
return true;
}
public override event EventHandler CanExecuteChanged;
}
自己的元素来指定CommandExecuted
事件:
public class Callbackable : ContentControl
{
public static readonly RoutedEvent CommandExecutedEvent = EventManager.RegisterRoutedEvent(
"CommandExecuted", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Callbackable));
// Provide CLR accessors for the event
public event RoutedEventHandler CommandExecuted
{
add { AddHandler(CommandExecutedEvent, value); }
remove { RemoveHandler(CommandExecutedEvent, value); }
}
}
编辑:
在您的控件中指定Callbackable.CommandExecuted
事件
<Grid>
<Grid.Resources>
<local:SimpleCommand x:Key="btnCommand" />
</Grid.Resources>
<local:Callbackable>
<Button Command="{StaticResource btnCommand}"
CommandParameter="param"
local:Callbackable.CommandExecuted="Button_Executed" >
Click me
</Button>
</local:Callbackable>
</Grid>
执行的事件处理程序:
private void Button_Executed(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("Executed");
}
于 2011-10-13T10:46:53.003 回答