[英]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}" />
您需要类实现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 }
现在绑定非常简单。 在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.