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
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
, aber ich lese auf vielen Seiten, die Modell und Modell müssen getrennt sein. –
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