2017-10-28 1 views
0

Ich bin neu in MvvmCross, ich habe eine Frage in Bezug auf die Bindung in Android. Ich kann an eine einzelne Eigenschaft binden, aber keine Daten an ein Objekt binden. Nicht sicher, was ich tue, falsch, aber hier ist es:MvvmCross Objekt Datenbindung

Modellklasse:

public class Login : MvxNotifyPropertyChanged 
{ 
    private string _email; 

    public string Email 
    { 
     get { return _email; } 
     set 
     { 
      SetProperty(ref _email, value); 
     } 
    } 

    public string Password { get; set; } 
} 

Snippet of View Model-Klasse:

public class LoginOptionViewModel: MvxViewModel 
{ 

    private readonly IMvxNavigationService _navigationService; 

    public LoginOptionViewModel(IMvxNavigationService navigationService) 
    { 
     _navigationService = navigationService; 

     LoginCommand = 
      new MvxAsyncCommand(async() => await _navigationService.Navigate<RegistrationViewModel>()); 

    } 

    public IMvxAsyncCommand LoginCommand { get; set; } 

    private Login _loginInfo; 

    public Login LoginInfo 
    { 
     get 
     { 
      return _loginInfo ?? new Login(); 
     } 
     set 
     { 
      _loginInfo = value; 
      RaisePropertyChanged(() => LoginInfo); 
     } 
    } 

} 

Snippet von Android Axml:

<EditText 
       android:id="@+id/loginEmailTxt" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="@string/EmailHint" 
       android:textColor="@color/darkNavy" 
       android:inputType="textEmailAddress" 
       local:MvxBind="Text LoginInfo.Email" /> 

Wo ich falsch liege, habe ich einen Haltepunkt platziert, sehe aber nicht, dass er getroffen wird. Dies ist EditText gebunden, aber nichts scheint zu passieren. Fehle ich oder mache ich etwas falsch, um an eine Objekteigenschaft zu binden?

Antwort

1

MvvmCross Objektdatenbindung

Sie können den MvxNotifyPropertyChanged-Schnittstelle implementieren, so könnte das System benachrichtigt Kunden, dass ein Eigenschaftswert geändert hat.

Ändern Sie bitte Ihre Objekt:

Im MainViewModel:

private Login _login; 
public Login Login 
{ 
    get 
    { 
     return _login ?? new Login() { Email = "=-="}; 
    } 
    set 
    { 
     _login = value; 
     RaisePropertyChanged(() => Login); 
    } 
} 

es dann in axml verwenden:

local:MvxBind="Text Login.Email" 

Es ist auf meiner Seite funktioniert gut.

Update:

Ich kann nicht Ihr Problem reproduzieren, aber hier ist meine komplette Code, hoffen, dass diese Ihnen helfen können:

public class MainViewModel : MvxViewModel 
{ 
    public MainViewModel() 
    { 
    } 

    public override Task Initialize() 
    { 
     return base.Initialize(); 
    } 

    public IMvxCommand ResetTextCommand => new MvxCommand(ResetText); 
    private void ResetText() 
    { 
     Text = "Hello MvvmCross"; 
    } 

    private string _text = "Hello MvvmCross"; 
    public string Text 
    { 
     get { return _text; } 
     set { SetProperty(ref _text, value); } 
    } 

    private Login _login; 
    public Login Login 
    { 
     get 
     { 
      return _login ?? new Login() { Email = "=-="}; 
     } 
     set 
     { 
      _login = value; 
      RaisePropertyChanged(() => Login); 
     } 
    } 
} 

public class Login : MvxNotifyPropertyChanged 
{ 
    private string _email; 
    public string Email 
    { 
     get => _email; 
     set => SetProperty(ref _email, value); 
    } 
} 

Effect.

+0

Hallo Dank für das Feedback, ich habe getan, was Sie erwähnt haben, aber es funktioniert immer noch nicht? hilft es, wenn ich erwähne, dass ich eine separate Lösung für das Modell habe? Auch im ViewModel, wenn ich eine Eigenschaft wie sie für Email = "= - =" gesetzt habe, bricht die App aus irgendeinem Grund. –

+0

@helloworld, ich habe meine Antwort aktualisiert, Sie können es überprüfen. –

+0

Ich habe das Gefühl, es ist wegen der seperaten Lösung, die es unmöglich macht, den gleichen Bezug von MVVM zu halten. Ich denke, dass die Domain in die gleiche Lösung platziert wird und dass sie am wahrscheinlichsten funktioniert. –