ViewModels成员未在Command上更新

时间:2012-09-30 14:55:13

标签: wpf mvvm-light

我正在使用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”;它不起作用。

2 个答案:

答案 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; }
    }
}