我正在使用MVVM light工具包来处理按钮点击。 如果我做
CustomerSaveCommand = new RelayCommand(
() => CustomerSave(),
()=> true);
}
private void CustomerSave() {
customer.Address="My Street";
}
调用该函数,但不更新UI中绑定的地址字段。
如果我在ViewModel构造函数中放置customer.Address =“1234”,则更新UI。我做错了什么?
编辑:
问题很奇怪:如果我做viewModel.customer.City =“CITY1”;在窗口加载它运行,如果我添加一个按钮,并在代码隐藏点击我添加viewModel.customer.City =“CITY2”;它不起作用。
答案 0 :(得分:2)
viewmodel中的customer对象需要实现INotifyPropertyChanged接口。
然后在Address Property setter中,您将调用PropertyChanged事件。
或者,您的viewModel可以实现INotifyPropertyChanged接口,并可以包装Address属性并调用PropertyChanged事件。您必须更新绑定,但您的模型对象不必实现任何接口。
当你在构造函数中修改对象时,你看到地址出现的原因是因为尚未发生绑定。为了更新UI,您需要指示绑定引擎属性绑定已更改。为此,您可以使用INotifyPropertyChanged接口。
答案 1 :(得分:0)
尝试这样的事情:
public class AutoDelegateCommand : RelayCommand, ICommand
{
public AutoDelegateCommand(Action<object> execute)
: base(execute)
{
}
public AutoDelegateCommand(Action<object> execute, Predicate<object> canExecute)
: base(execute, canExecute)
{
}
event EventHandler ICommand.CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}