我创建了一个带有按钮的新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
)
答案 0 :(得分:3)
您的绑定可能无效,因为没有任何内容表明Button1Command
属性是您UserControl
的成员。
在Visual Studio中调试程序时,可以通过查看“输出”窗口来确认这是问题所在。您可能会看到未找到成员Button1Command
的绑定错误。
典型的解决方法是为UserControl
的根元素添加名称属性,例如x:Name="root"
(如果有的话,可以选择自己的名称或使用现有名称) 。然后,将绑定更改为命令以引用新名称:
<Button Name="Button1" Command="{Binding Button1Command, ElementName=root}" />
答案 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
}
现在绑定非常简单。 在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;
}
就是这样......