Wpf 命令未更新ViewModels成员

Wpf 命令未更新ViewModels成员,wpf,mvvm-light,Wpf,Mvvm Light,我正在使用MVVM light toolkit来处理按钮单击。如果我这样做: CustomerSaveCommand = new RelayCommand( () => CustomerSave(), ()=> true); private void CustomerSave() { customer.Address="My Street"; } 调用该函数,但不更新UI中绑定的地址字段 如果我将customer.Address=“12

我正在使用MVVM light toolkit来处理按钮单击。如果我这样做:

CustomerSaveCommand = new RelayCommand(
    () => CustomerSave(),
    ()=> true);

private void CustomerSave() {
    customer.Address="My Street";
}
调用该函数,但不更新UI中绑定的地址字段

如果我将
customer.Address=“1234”
放在ViewModel构造函数中,则会更新UI。我做错了什么

编辑:


问题真的很奇怪:如果我在运行的加载窗口中添加了一个按钮,然后在后面的代码中单击,我添加了viewModel.customer.City=“CITY2”它就不起作用了。

试试这样的方法:

    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; }
    }
}
public类AutoDelegateCommand:RelayCommand、ICommand
{
公共AutoDelegateCommand(操作执行)
:base(执行)
{
}
公共AutoDelegateCommand(操作执行,谓词canExecute)
:base(执行、canExecute)
{
}
事件事件处理程序ICommand.CanExecuteChanged
{
添加{CommandManager.RequerySuggested+=value;}
删除{CommandManager.RequerySuggested-=value;}
}
}

视图模型中的客户对象需要实现该界面

然后在地址属性设置器中,调用PropertyChanged事件

或者,您的viewModel可以实现INotifyPropertyChanged接口,并可以包装Address属性并调用PropertyChanged事件。您必须更新绑定,但您的模型对象不必实现任何接口


当您在构造函数中修改对象时,您看到地址出现的原因是因为绑定尚未发生。为了更新UI,您需要指示绑定引擎属性绑定已更改。要做到这一点,您需要使用INotifyPropertyChanged界面。

我认为它一定是与众不同的:如果我使用viewModel.customer.City=“CITY1”;如果我在加载窗口中添加一个按钮,并在代码隐藏中单击我添加viewModel.customer.City=“CITY2”,它将运行;它不起作用。非常感谢您的解释:我实际上有一个公共类MyViewModel:INotifyPropertyChanged{private Customer{U Customer;public Customer{get{return{U Customer;}set{U Customer=value;RaisePropertyChanged(“customer”);}}}}}}这还不足以进行数据绑定吗?我希望不必为每个记录都更改NotifyPropertyChanged。Cris,您需要为customer类中的Address属性提高PropertyChanged(“Address”);否则,您需要在ViewModel上创建一个名为“Address”的新属性“看起来是这样的:UI绑定到的公共字符串地址{get{return customer.Address;}set{{u customer.Address=value;RaisePropertyChanged(“Address”);}}},而不是直接的customer对象。customer类是由EntityFramework自动生成的,所以我认为修改它是不好的。”。实际上,如您所说,如果我创建一个Address属性,它运行良好。我希望使用customer对象直接绑定单个db记录。@Cris我认为EntityFramework自动生成的customer类实际上是一个分部类,因此您可以定义另一个实现INotifyPropertyChanged的分部customer类,并在那里定义address属性。有关详细信息,请参见分部类。@但是,使用分部类技巧将导致两个地址属性,这也有点糟糕。因此,您可能希望使用EntityFramework来定义如何自动生成Address属性(即实现INotifyPropertyChanged)。