我有一个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
属性。如何捕获每个框(即
EditText
和Salary
)的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;
}
}
}