我正在使用具有“保存”按钮的MVVM应用程序,如果“标题”字段为空,我想禁用该按钮。
这是委托命令的代码:
_clickSaveChangesCommand = new DelegateCommand<string>(
(s) => { saveStudentRecord(); //execute },
(s) => { return (_student.Title != null); /*Can execute*/ }
);
这里是绑定:
<TextBox Name="fldTitle" Text="{Binding Path=Student.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="300" Height="27" />
当我从视图模型中更新学生对象时,它会按预期工作。但是,如果我创建新记录并在文本框中键入内容,则该按钮将无法执行。在我的测试中,如果我尝试显示_student的值。标题显示为预期值。
答案 0 :(得分:0)
当CanExecuteChanged
更改时,您需要做一些事情来引发命令的_student.Title
事件。
您是否正在使用Prism的DelegateCommand?如果是这样,安迪发现了this answer。如果支持,它可能比下面的建议更好。但是see this question,就像您的情况一样,因为该属性是“孙代”属性,而不是拥有命令的类的直接属性。
如果您正在使用Prism,并且可以这样做,请尝试替换Student
以查看会发生什么。在2016年,这将破坏启用更新的命令。可能还是。
所以,如果那行不通,应该这样做。
您的DelegateCommand<T>
类可能具有执行该操作的方法;通常称为RaiseCanExecuteChanged()
或类似名称。
最好,最好的方法是在Student
的设置器中:
public Student Student
{
get { return _student; }
set
{
if (value != _student)
{
if (_student != null)
{
// You do want to unhook this, otherwise there's a live reference
// to the old _student and it won't be free to be garbage collected.
_student.PropertyChanged -= _student_PropertyChanged;
}
_student = value;
if (_student != null)
{
_student.PropertyChanged += _student_PropertyChanged;
}
OnPropertyChanged();
}
}
}
private void _student_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Title")
{
ClickSaveChangesCommand.RaiseCanExecuteChanged();
}
}