カスタムコントロール(ボタンと同様)にICommandSourceを実装しようとしています。現在、実装は、ICommandSourceのmsdnページに表示され、ButtonBaseソースコードに表示されているようなものです。
CanExecuteは、コントロールのロード時に起動しますが、プロパティが変更されたときには起動しません。通常のボタンに渡される同じコマンドは問題なく機能します。変更するはずのプロパティが変更されると、CanExecuteが起動し、ボタンが有効になります。コマンドは委任コマンドです。
CommandManager.InvalidateRequerySuggested();を試しました。しかし、それはうまくいきませんでした。
何か案は?
カスタムコントロールの実装は次のとおりです。
private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
CollapsibleSplitButton csb = (CollapsibleSplitButton)d;
csb.OnCommandChanged((ICommand)e.OldValue, (ICommand)e.NewValue);
}
private void OnCommandChanged(ICommand oldCommand, ICommand newCommand)
{
if (oldCommand != null) UnhookCommand(oldCommand);
if (newCommand != null) HookCommand(newCommand);
}
private void UnhookCommand(ICommand command)
{
command.CanExecuteChanged -= OnCanExecuteChanged;
UpdateCanExecute();
}
private void HookCommand(ICommand command)
{
command.CanExecuteChanged += OnCanExecuteChanged;
UpdateCanExecute();
}
private void OnCanExecuteChanged(object sender, EventArgs e)
{
UpdateCanExecute();
}
private void UpdateCanExecute()
{
if (Command != null)
CanExecute = Command.CanExecute(CommandParameter);
else
CanExecute = true;
}
protected override bool IsEnabledCore
{
get { return base.IsEnabledCore && CanExecute; }
}
私が持っているコマンドを設定する場所:
...
MyCommand = new DelegatingCommand(DoStuff, CanDoStuff);
...
private bool CanDoStuff()
{
return (DueDate == null);
}
private void DoStuff() {//do stuff}