コントロールのボタン(最終的にはを実行する)にハンドラー(コールバック)をアタッチして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 に答える