按钮命令绑定不起作用

时间:2013-05-07 07:50:08

标签: c# .net wpf

我创建了一个带有按钮的新UserContol。我想将button命令绑定到新用户控件的dependancy属性,如下所示。

<Grid>
 <Button Name="Button1" Command="{Binding Button1Command}" />
</Grid>

这是包含UserControl的DP:

public ICommand Button1Command
{
  get { return (ICommand)GetValue(Button1CommandProperty); }
  set { SetValue(Button1CommandProperty, value); }
}

public static readonly DependencyProperty Button1CommandProperty =
    DependencyProperty.Register("Button1Command", typeof(ICommand), typeof(BptCellTemplate), new FrameworkPropertyMetadata(null));

当我尝试使用它时按下按钮没有任何反应。它无法识别该命令。如果我添加一个事件就行了。像这样:

 public static readonly DependencyProperty Button1CommandProperty =
    DependencyProperty.Register("Button1Command", typeof(ICommand), typeof(BptCellTemplate), new FrameworkPropertyMetadata(null, OnButton1CommandChanged));

private static void OnButton1CommandChanged(DependencyObject dependencyObject,
                                              DependencyPropertyChangedEventArgs args)
{
  var bptCellTemplate = dependencyObject as BptCellTemplate;
  if (bptCellTemplate == null || !(args.NewValue is ICommand))
  {
    return;
  }
  (bptCellTemplate.DataContext as BptCellTemplateViewModel).Button1Command = (ICommand)args.NewValue;

}

有没有办法在没有事件的情况下绑定它?因为它适用于其他按钮属性,我以相同的方式(例如Visibility

2 个答案:

答案 0 :(得分:3)

您的绑定可能无效,因为没有任何内容表明Button1Command属性是您UserControl的成员。

在Visual Studio中调试程序时,可以通过查看“输出”窗口来确认这是问题所在。您可能会看到未找到成员Button1Command的绑定错误。

典型的解决方法是为UserControl的根元素添加名称属性,例如x:Name="root"(如果有的话,可以选择自己的名称或使用现有名称) 。然后,将绑定更改为命令以引用新名称:

<Button Name="Button1" Command="{Binding Button1Command, ElementName=root}" />

答案 1 :(得分:1)

  1. 您需要类实现ICommand接口。

    public class RelayCommand : ICommand
    {
        #region Fields
    
        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;
    
        #endregion // Fields
    
        #region Constructors
    
        /// <summary>
        /// Creates a new command that can always execute.
        /// </summary>
        /// <param name="execute">The execution logic.</param>
        public RelayCommand(Action<object> execute)
            : this(execute, null)
        {
        }
    
        /// <summary>
        /// Creates a new command.
        /// </summary>
        /// <param name="execute">The execution logic.</param>
        /// <param name="canExecute">The execution status logic.</param>
        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null)
                throw new ArgumentNullException("execute");
    
            _execute = execute;
            _canExecute = canExecute;
        }
    
        #endregion // Constructors
    
        #region ICommand Members
    
        [DebuggerStepThrough]
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }
    
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    
        public void Execute(object parameter)
        {
            _execute(parameter);
        }
    
        #endregion // ICommand Members
    }
    
  2. 现在绑定非常简单。 在DataContext中定义命令(MVVM等) 不记得设置DataContext ...例如DataContext = this; (这是你的窗口)

    RelayCommand _btnCommand;
    public ICommand Button1Command
    {
        get
        {
            if (_btnCommand == null)
            {
                _btnCommand = new RelayCommand(param => this.ExecuteButton1(),
                    param => this.CanButton1());
            }
            return _btnCommand;
        }
    }
    
    public void ExecuteButton1()
    {
    }
    
    public bool CanButton1()
    {
        return true;
    }
    
  3. 就是这样......