ICommand DependencyProperty PropertyChanged回调

时间:2016-04-12 18:59:30

标签: c# wpf xaml

在我的自定义控件中,每当调用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}"/>

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

2 个答案:

答案 0 :(得分:1)

正如我(以及其他一些人)在评论中所说,只有在修改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;
        }       
    }
}   

答案 1 :(得分:1)

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

简单解决方案

由于它是您的自定义控件,因此您可以自由使用事件。以下是步骤:

  1. DON&#39; T 将命令注册到按钮。 (和我一起去)
  2. 在您感兴趣的按钮的单击事件中注册。
  3. 点击后,在 ICommand 依赖项属性上调用执行方法。
  4. 使用您自己的逻辑完成 Click 处理程序的实现。
  5. 通过这种方式,您可以完全自由地执行命令后执行任何操作。

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

    已完成的解决方案

    创建自己的抽象基本命令实现。通常,在此实现中,您将有一些抽象方法可以覆盖任何派生类以及将在战略位置触发的一些事件。

    这个解决方案需要更多的解释,所以如果简单的解决方案对您不起作用,请分享它,并且我将澄清复杂的解决方案。

    快乐的编码! :)