我有一个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
?
答案 0 :(得分:1)
要绑定的正确属性是EditPerson
而不是Person,正如Matt和PlaceHold3r注意到的那样。
但是关于你的问题,当改变Person对象的Age或Salary时,你的EditPerson
setter不会触发。只有在重新分配整个对象时才会被触发,即:ViewModel.EditPerson = new Person();
如果要检测Age或Salary的更改,您的Person对象需要实现INotifyPropertyChanged。然后,您可以收听Person:Age,Salary等的任何属性更改
<强>更新强>
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;
}
}
}
答案 1 :(得分:0)
首先猜测,因为我还没有看到更多信息。您绑定Person,但您的Person ViewModels名称是EditPerson。所以试试这个:
local:MvxBind="Text EditPerson.Age, Converter=Nullable, ConverterParameter='0.0'"
正如其他人所说,这不是完整的解决方案。我要求你的Person类的原因是,Person
实现INotifyPropertyChanged
。这是通常的方式(在MvvmCross中也可以使用其他解决方案)让EditTexts监听viewmodel中的更改。在您的人物设置者中,您必须致电
RaisePropertyChanged(() => EditPerson);
然后您可以在此位置设置断点
答案 2 :(得分:0)
即使您使用以下内容,editText也永远不会更改ViewModel的EditPerson属性:
local:MvxBind="Text EditPerson.Age, Converter=Nullable, ConverterParameter='0.0'"
原因是editText正在更改的属性是属于您的Age
类的Person
。您可以在set
课程的Person
中选择更改。