繁体   English   中英

按钮命令绑定不起作用

[英]Button command binding doesn't work

我创建了一个新的UserContol,里面有一个按钮。 想要像这样将button命令绑定到新用户控件的依赖性属性。

<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

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

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

通常的解决方法是在UserControl的根元素中添加名称属性,例如x:Name="root" (您可以选择自己的名称,或者使用已有的名称)。 然后,更改对命令的绑定以引用新名称:

<Button Name="Button1" Command="{Binding Button1Command, ElementName=root}" />
  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 ... ect。)中定义命令。别记得设置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; } 

而已 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM