C# ICommand DependencyProperty属性更改回调

C# ICommand DependencyProperty属性更改回调,c#,wpf,xaml,C#,Wpf,Xaml,在自定义控件中,每当调用我的ICommand依赖项属性时,我都试图调用一个方法(即PropertyChangedCallback) 我使用PropertyChangedCallback方法具有以下依赖属性 public static readonly DependencyProperty ActiveOutput1Property = DependencyProperty.Register("ActiveOutput1", typeof(ICommand),

在自定义控件中,每当调用我的
ICommand
依赖项属性时,我都试图调用一个方法(即PropertyChangedCallback)

我使用PropertyChangedCallback方法具有以下依赖属性

  public static readonly DependencyProperty ActiveOutput1Property =
      DependencyProperty.Register("ActiveOutput1", typeof(ICommand),
          typeof(CustomAxis_IO),
          new PropertyMetadata((ICommand)null,
              new PropertyChangedCallback(OnOutput1Changed)
            ));

 private static void OnOutput1Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ;
    }
我在这里的控件中实现了这个依赖属性

<Button Command="{Binding RelativeSource={RelativeSource TemplatedParent},Path=ActiveOutput1}"/>

每次按下按钮时,它都会调用绑定到
ActivateOutput1
依赖项属性的
ICommand
属性。所以我知道这是可行的。但是,我的PropertyChangedCallback,
OnOutput1Changed
,仅在应用程序启动时调用。每次调用我的
ICommand
依赖属性(
ActivateOutput1
)时,如何获取回调

正如我(以及其他一些人)在评论中所说,只有在修改DependencyProperty的值时才会调用PropertyChangedCallback。当您调用ICommand时,您只是在调用它。因此,不会调用PropertyChangedCallback。您可以尝试创建自己的ICommand实现。大概是这样的:

public class CallbackAfterExecutionCommand : ICommand
{
    private Action<IMyView> _callback;

    // You can set this property on the PropertyChangedCallback class
    public IMyView View
    {
        get;
        set;
    }

    public CallbackAfterExecutionCommand(Action<IMyView> callback)
    {
        _callback = callback;
    }

    public bool CanExecute(object parameter)
    {
        // If you want, you can implement something here
        return true;
    }

    public void Execute(object parameter)
    {
        try
        {
            // Do whatever you want here. But you can also pass the execution
            // logic through a parameter on the constructor

            _callback(View);
        }
        catch (Exception ex)
        {
            throw ex;
        }       
    }
}   
public类CallbackAfterExecutionCommand:ICommand
{
私人行动;
//您可以在PropertyChangedCallback类上设置此属性
公共IMyView视图
{
得到;
设置
}
公共CallbackAfterExecutionCommand(操作回调)
{
_回调=回调;
}
公共布尔CanExecute(对象参数)
{
//如果你愿意,你可以在这里实现一些东西
返回true;
}
public void Execute(对象参数)
{
尝试
{
//你想干什么就干什么,但你也可以通过死刑
//通过构造函数上的参数执行逻辑
_回调(视图);
}
捕获(例外情况除外)
{
掷骰子;
}       
}
}   
正如我(以及其他一些人)在评论中所说,只有在修改DependencyProperty的值时才会调用PropertyChangedCallback。当您调用ICommand时,您只是在调用它。因此,不会调用PropertyChangedCallback。您可以尝试创建自己的ICommand实现。大概是这样的:

public class CallbackAfterExecutionCommand : ICommand
{
    private Action<IMyView> _callback;

    // You can set this property on the PropertyChangedCallback class
    public IMyView View
    {
        get;
        set;
    }

    public CallbackAfterExecutionCommand(Action<IMyView> callback)
    {
        _callback = callback;
    }

    public bool CanExecute(object parameter)
    {
        // If you want, you can implement something here
        return true;
    }

    public void Execute(object parameter)
    {
        try
        {
            // Do whatever you want here. But you can also pass the execution
            // logic through a parameter on the constructor

            _callback(View);
        }
        catch (Exception ex)
        {
            throw ex;
        }       
    }
}   
public类CallbackAfterExecutionCommand:ICommand
{
私人行动;
//您可以在PropertyChangedCallback类上设置此属性
公共IMyView视图
{
得到;
设置
}
公共CallbackAfterExecutionCommand(操作回调)
{
_回调=回调;
}
公共布尔CanExecute(对象参数)
{
//如果你愿意,你可以在这里实现一些东西
返回true;
}
public void Execute(对象参数)
{
尝试
{
//你想干什么就干什么,但你也可以通过死刑
//通过构造函数上的参数执行逻辑
_回调(视图);
}
捕获(例外情况除外)
{
掷骰子;
}       
}
}   

如果您了解您要实现的目标,则在单击按钮并完成命令执行操作后,您将尝试运行一些逻辑


简单解 因为它是您的自定义控件,所以您可以自由使用事件。以下是步骤:

  • 不要将命令注册到按钮。(跟我来)
  • 在您感兴趣的按钮的单击事件上注册
  • 单击后,对ICommand依赖项属性调用Execute方法
  • 使用自己的逻辑完成Click处理程序的实现
  • 这样,在执行命令后,您就可以自由地做任何您想做的事情

    !!!注意 如果还需要将CanExecute绑定到按钮的IsEnabled属性,则可以注册到CommandManager.RequerySuggested事件,该事件将在每次UI中发生更改时触发。此时,执行ICommand依赖属性的CanExecute,并将返回的布尔值放入按钮中的IsEnabled属性


    络合溶液 创建自己的抽象基本命令实现。一般来说,在这个实现中,您将有一些抽象方法在任何派生类中重写,以及一些将在关键位置触发的事件

    这个解决方案需要更多的解释,因此,如果简单的解决方案不适合您,请分享它,我将澄清复杂的解决方案


    快乐编码!:)

    如果您了解您想要实现的目标,那么在单击按钮并完成命令执行操作后,您将尝试运行一些逻辑


    简单解 因为它是您的自定义控件,所以您可以自由使用事件。以下是步骤:

  • 不要将命令注册到按钮。(跟我来)
  • 在您感兴趣的按钮的单击事件上注册
  • 单击后,对ICommand依赖项属性调用Execute方法
  • 使用自己的逻辑完成Click处理程序的实现
  • 这样,在执行命令后,您就可以自由地做任何您想做的事情

    !!!注意 如果还需要将CanExecute绑定到按钮的IsEnabled属性,则可以注册到CommandManager.RequerySuggested事件,该事件将在每次UI中发生更改时触发。此时,执行ICommand依赖属性的CanExecute,并将返回的布尔值放入按钮中的IsEnabled属性


    络合溶液 创建自己的抽象基本命令实现。一般来说,在这个实现中,您将有一些抽象方法在任何派生类中重写,以及一些将在关键位置触发的事件。