2016-07-22 10 views
1

Ich habe Login-Authentifizierung mit MVVM erstellt und es hat gut funktioniert. Dies ist, was ich getan habe:Beziehung zwischen Model View und View-Modell in WPF

MainWinodw.xaml

<Window.Resources> 
    <BooleanToVisibilityConverter x:Key="BoolToVis" /> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <TextBlock Grid.Row="0" Grid.Column="0">UserName:</TextBlock> 
    <TextBlock Grid.Row="1" Grid.Column="0">Password:</TextBlock> 
    <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <Label Grid.Row="3" Grid.ColumnSpan="2" Visibility="{Binding isAuthenticated, Converter={StaticResource BoolToVis}}"> 
     User has been authenticated 
    </Label> 
    <Label Grid.Row="3" Grid.ColumnSpan="2" Visibility="{Binding LoginFail, Converter={StaticResource BoolToVis}}"> 
     Please enter valid UserName and Password 
    </Label> 

    <Button Grid.Row="2" Grid.Column="1" Content="Authenticate" Command="{Binding LoginCommand}" Margin="3" Width="100" HorizontalAlignment="Right" /> 
</Grid> 

UserViewModel.cs

public class LoginViewModel : INotifyPropertyChanged 
{ 
    private bool _isAuthenticated; 
    public bool isAuthenticated 
    { 
     get { return _isAuthenticated; } 
     set 
     { 
      if (value != _isAuthenticated) 
      { 
       _isAuthenticated = value; 
       OnPropertyChanged("isAuthenticated"); 
      } 
     } 
    } 

    private bool _loginFail; 
    public bool LoginFail 
    { 
     get { return _loginFail; } 
     set 
     { 
      if (value != _loginFail) 
      { 
       _loginFail = value; 
       OnPropertyChanged("LoginFail"); 
      } 
     } 
    } 

    private string _username; 
    public string UserName 
    { 
     get { return _username; } 
     set 
     { 
      _username = value; 
      OnPropertyChanged("UserName"); 
     } 
    } 

    private string _password; 
    public string Password 
    { 
     get { return _password; } 
     set 
     { 
      _password = value; 
      OnPropertyChanged("Password"); 
     } 
    } 

    public ICommand LoginCommand 
    { 
     get { return new RelayCommand(param => this.Login()); } 
    } 

    public void Login() 
    { 
     //TODO check username and password vs database here. 
     //If using membershipprovider then just call Membership.ValidateUser(UserName, Password) 
     //if (!String.IsNullOrEmpty(UserName) && !String.IsNullOrEmpty(Password)) 
     // isAuthenticated = true; 
     isAuthenticated = LoginDataLayer.AuthenticateUser(UserName, Password); 
     if(isAuthenticated == true) 
     { 
      LoginFail = false; 
     } 
     else 
     { 
      LoginFail = true; 
     } 

    } 

    #region INotifyPropertyChanged Methods 

    public void OnPropertyChanged(string propertyName) 
    { 
     this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs args) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, args); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

Dies funktioniert gut. Aber wie gesagt, ich bin neu bei MVVM. Ich schreibe Modellcode auch im Viewmodel. Nach der Realisierung meines Fehlers habe ich versucht, wie dieses Modell und View-Modell Code zu trennen:

UserModel.cs

public class UserModel : INotifyPropertyChanged 
{ 
    private bool _isAuthenticated; 
    public bool isAuthenticated 
    { 
     get { return _isAuthenticated; } 
     set 
     { 
      if (value != _isAuthenticated) 
      { 
       _isAuthenticated = value; 
       OnPropertyChanged("isAuthenticated"); 
      } 
     } 
    } 

    private bool _loginFail; 
    public bool LoginFail 
    { 
     get { return _loginFail; } 
     set 
     { 
      if (value != _loginFail) 
      { 
       _loginFail = value; 
       OnPropertyChanged("LoginFail"); 
      } 
     } 
    } 

    private string _username; 
    public string UserName 
    { 
     get { return _username; } 
     set 
     { 
      _username = value; 
      OnPropertyChanged("UserName"); 
     } 
    } 

    private string _password; 
    public string Password 
    { 
     get { return _password; } 
     set 
     { 
      _password = value; 
      OnPropertyChanged("Password"); 
     } 
    } 

    #region INotifyPropertyChanged Methods 

    public void OnPropertyChanged(string propertyName) 
    { 
     this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs args) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, args); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

UserViewModel.cs

public void Login() 
    { 
     UserModel obj = new UserModel(); 


     obj.isAuthenticated = LoginDataLayer.AuthenticateUser(obj.UserName,obj. Password); 
     if(obj.isAuthenticated == true) 
     { 
      obj.LoginFail = false; 
     } 
     else 
     { 
      obj.LoginFail = true; 
     } 

    } 

Aber ich bin immer obj.username null ist. So kann mir jemand helfen, wie ich Model Property im View Model bekomme und wie es updaten kann. Bitte helfen Sie. Danke

+0

Ich denke nicht, daßR Sie beide Logik zusammen halten kann nicht. Die Methoden in ViewModel sind kein Problem. Sie können mit Ihrem Ansatz voran gehen – Apoorv

+0

, aber ich lese auf vielen Seiten, die Modell und Modell müssen getrennt sein. –

+0

ok eine Sache .. in Ihrem UserViewModel.cs ersetzen UserModel obj = new UserModel() mit ObservableCollection coll = new ObservableCollection (); versuchen Sie dann, auf die Werte zuzugreifen und zu sehen, ob Sie immer noch null erhalten? – Apoorv

Antwort

1

Wie ich es sehe, ist Ihr View DataContext das ViewModel, aber die Eigenschaften sind auf dem Modell. Machen Sie Ihre UserModel accesible von der Ansicht Modell, wie folgt aus:

Ansichtsmodell:

private UserModel _userModel; 
public UserModel userModel 
{ 
    get { return _userModel; } 
    set 
    { 
     _userModel = value; 
     OnPropertyChanged("userModel"); 
    } 
} 

Ausblick:

<TextBox Text="{Binding userModel.UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />