2016-04-29 53 views
1

我有一個Person對象,我將此對象從ViewModel A傳遞到ViewModel B在MVVMCross中捕獲EditText更改

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'" /> 

這裏是在ViewModel B

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

EditPerson屬性我不知道,當我修改這些EditText的,在調試模式下,它不打EditPerson物業都沒有。

如何爲每個方塊捕獲EditText變化,即SalaryAge

+0

你是如何從VM_A傳遞對象VM_B?因爲這是一個複雜的對象類型,需要序列化。 –

+0

我只是從'ViewModel A'傳遞'personId'到'ViewModel B',然後再次調用服務來獲得相應的'Person'對象。它的工作原理,我可以看到選定的「人」。它還在EditText中顯示選定的人員工資和年齡,但是當我更改'EditText'如Age或Salary時,它不會觸及'EditPerson'屬性。 – hotspring

+0

它爲什麼會碰到EditPerson?你爲什麼不爲你的EditText使用簡單的'onTextChangedListener'? –

回答

1

要正確綁定的屬性是EditPerson而不是Person,正如Matt和PlaceHold3r注意到的那樣。

但是關於你的問題,你的EditPerson二傳手在改變人物對象的Age或Salary時不會觸發。如果您重新分配整個對象,它只會被解僱,例如:ViewModel.EditPerson = new Person();

如果您想檢測Age或Salary的更改,您的Person對象需要實現INotifyPropertyChanged。然後,你可以聽的人的財產變化:年齡,工資等

UPDATE

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; 
     } 
    } 
} 
+0

我已更改爲以下內容,但仍未更改,當我更改任何編輯文本(如年齡或性別)時,我無法擊中EditPerson。 'local:MvxBind =「Text EditPerson.Age,Converter = Nullable,ConverterParameter ='0.0'」'你也可以在我的問題中看到變化。 – hotspring

+0

您確定在Person對象中實現了INotifyPropertyChanged嗎?請看我最新的答案 – xleon

0

首先猜測,因爲我沒有看到更多信息。您在Person上綁定,但您的Person ViewModels名稱爲EditPerson。所以試試這個:

local:MvxBind="Text EditPerson.Age, Converter=Nullable, ConverterParameter='0.0'" 

正如另一種說法,這不是完整的解決方案。我要求你的Person類的原因是要看Person是否實現了INotifyPropertyChanged。這是通常的方式(在MvvmCross中也有其他可行的解決方案)讓EditTexts監聽視圖模型中的變化。在人的你的財產製定者必須調用

RaisePropertyChanged(() => EditPerson); 

,然後您可以設置斷點這個位置

+0

我改變如下,但仍然沒有改變,當我改變任何編輯文本,如年齡或性別時,我無法擊中EditPerson。 'local:MvxBind =「Text EditPerson.Age,Converter = Nullable,ConverterParameter ='0.0'」'你也可以在我的問題中看到變化。 – hotspring

0

的EDITTEXT永遠不會改變你的視圖模型的EditPerson的屬性,即使您使用:

local:MvxBind="Text EditPerson.Age, Converter=Nullable, ConverterParameter='0.0'" 

原因是由editText更改的屬性是Age,屬於您的Person類。您可以在Person課程的set中找到更改。

+0

我想那時我誤解了這個問題;) – Matt

+0

我已經改成EditPerson了,但還是一樣的。 – hotspring

+0

我已更改爲以下內容,但仍未更改,當我更改任何編輯文本(如年齡或性別)時,我無法擊中EditPerson。 'local:MvxBind =「Text EditPerson.Age,Converter = Nullable,ConverterParameter ='0.0'」'你也可以在我的問題中看到變化。 – hotspring