捕获MVVMCross中的EditText更改

时间:2016-04-29 23:40:39

标签: android xamarin mvvmcross

我有一个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更改,例如SalaryAge

3 个答案:

答案 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中选择更改。