我有一个Person对象,我正在将该对象从ViewModel A传递到ViewModel B

View B中,显示以下信息。

 <EditText
     style="@style/InputNumbersEditText"
     android:layout_weight="1"
     android:layout_width="0dp"
     android:layout_height="36dp"
     local:MvxBind="Text EditPerson.Age, Converter=Nullable, ConverterParameter='0.0'" />

 <EditText
     style="@style/InputNumbersEditText"
     android:layout_weight="1"
     android:layout_width="0dp"
     android:layout_height="36dp"
     local:MvxBind="Text EditPerson.Salary, Converter=Nullable, ConverterParameter='0.0'" />


这是EditPerson中的ViewModel B属性

public Person EditPerson
{
   get { return _editPerson; }
   set
   {
      _editPerson = value;
       RaisePropertyChanged(() => EditPerson);
    }
 }


我想知道在调试模式下编辑这些EditText中的任何一个时,它根本不会命中EditPerson属性。

如何捕获每个框(即EditTextSalary)的Age更改?

最佳答案

Matt和PlaceHold3r注意到,要绑定的正确属性是EditPerson而不是Person。

但是,关于您的问题,更改“人员”对象的“年龄”或“工资”时,您的EditPerson设置器不会触发。仅当您重新分配整个对象时才会触发,即:ViewModel.EditPerson = new Person();

如果要检测“年龄”或“工资”的更改,则“人”对象需要实现INotifyPropertyChanged。然后,您可以收听此人的任何财产变更:年龄,薪水等。

更新

public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int _age;
    private decimal _salary;

    public int Age
    {
        get { return _age; }
        set
        {
            _age = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Age"));
        }
    }

    public decimal Salary
    {
        get { return _salary; }
        set
        {
            _salary = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Salary"));
        }
    }
}

public class YourViewModel : MvxViewModel
{
    private Person _editPerson;
    public Person EditPerson
    {
        get { return _editPerson; }
        set
        {
            if (_editPerson != null)
                _editPerson.PropertyChanged -= EditPersonOnPropertyChanged;

            _editPerson = value;
            RaisePropertyChanged(() => EditPerson);

            _editPerson.PropertyChanged += EditPersonOnPropertyChanged;
        }
    }

    private void EditPersonOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
    {
        switch (propertyChangedEventArgs.PropertyName)
        {
            case "Salary":
                Debug.WriteLine("Salary has changed");
                break;

            case "Age":
                Debug.WriteLine("Age has changed");
                break;
        }
    }
}

10-08 15:04