【发布时间】:2015-05-08 17:39:04
【问题描述】:
我有一个文本框供用户输入字符串,还有一个“添加”按钮来执行一些带有该值的任务。我在 DelegateCommand 中添加了一个 CanExecute 方法,以便该按钮仅在框中有文本时才起作用。
但是,它始终处于禁用状态 - 即使条件为真。在框中键入不会启用按钮。
<TextBox Text="{Binding BuildEntryText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="{Binding AddBuildCommand}" Content="Add" />
this.AddBuildCommand = new DelegateCommand(() => this.AddBuild(), () => this.CanAddBuild());
private bool CanAddBuild()
{
if (this.BuildEntryText != null)
{
return true;
}
else
{
return false;
}
}
我以前也遇到过这种情况(并不总是使用相同类型的控件),通常我会删除 CanExecute 并将其更改为操作方法中的“if”检查。不过,这一次,我实际上必须让它工作并以“正确”的方式将按钮变灰。
任何见解将不胜感激。提前致谢。
更新:
我已将 RaiseCanExecuteChanged 添加到 BuildEntryText 属性的设置部分。现在按钮开始禁用并在第一次输入文本时启用。但是,即使在删除文本或通过添加功能清除框后,它仍然处于启用状态。
public string BuildEntryText
{
get
{
return this.buildEntryText;
}
set
{
this.SetProperty<string>(ref this.buildEntryText, value);
this.AddBuildCommand.RaiseCanExecuteChanged();
}
}
【问题讨论】:
-
你有什么样的
DelegateCommand?听起来它不会在发生任何更改通知时自动重新查询 CanExecuteChanged 。解决方案是在需要时手动提高 CanExecuteChanged like this,或者更改您的命令定义 -
@Rachel:我不知道 DelegateCommand 有不同的种类。我在 BuildEntryText 中的 SetProperty 调用之后添加了 RaiseCanExecuteChanged,现在当输入文本时该按钮变为启用状态。但是,删除文本时它不会禁用。
-
@Cricketheads,展示你的 DelegateCommand 实现。如果 CanExecuteChanged 没有正确实现,它不会通知绑定到命令的控件。
-
@ThomasLevesque:我不完全确定,但听起来你在问我在哪里添加了 RaiseCanExecuteChanged,我已将其附加到上述问题中。
-
@Cricketheads,不,我问的是你是如何实现
CanExecuteChanged事件的。在典型的实现中,您只需委托CommandManager.RequerySuggested事件,该事件会自动引发。如果你这样做,你不需要手动调用RaiseCanExecuteChanged。
标签: wpf data-binding delegatecommand