PasswordBox how to pass data to viewModel
This is a piece of code from View:
This is a piece of code from ViewModel:
private void PasswordInput_PasswordChanged(object sender, RoutedEventArgs e)
{
if (DataContext is RegistrationVM vm && sender is PasswordBox passwordBox)
{
vm.Password = passwordBox.SecurePassword;
MessageBox.Show($"Password {passwordBox.SecurePassword} | {passwordBox.Password}");
}
}
private void PasswordInput_PasswordChanged(object sender, RoutedEventArgs e)
{
if (DataContext is RegistrationVM vm && sender is PasswordBox passwordBox)
{
vm.Password = passwordBox.SecurePassword;
MessageBox.Show($"Password {passwordBox.SecurePassword} | {passwordBox.Password}");
}
}
public ICommand RegisterCommand { get; }
private async Task Register()
{
if (IsPasswordValid())
{
string password = ConvertSecureStringToString(Password);
bool success = await _tcpClientService.RegisterAsync(UserLogin, password);
if (success)
{
MessageBox.Show("Регистрация успешна!");
NavigateToLogin();
}
else
{
MessageBox.Show("Ошибка регистрации!");
}
}
else
{
MessageBox.Show("Пароли не совпадают или слишком короткие!");
}
}
private string ConvertSecureStringToString(SecureString secureString)
{
IntPtr unmanagedString = IntPtr.Zero;
try
{
unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(secureString);
return Marshal.PtrToStringUni(unmanagedString);
}
finally
{
if (unmanagedString != IntPtr.Zero)
{
Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
}
public ICommand RegisterCommand { get; }
private async Task Register()
{
if (IsPasswordValid())
{
string password = ConvertSecureStringToString(Password);
bool success = await _tcpClientService.RegisterAsync(UserLogin, password);
if (success)
{
MessageBox.Show("Регистрация успешна!");
NavigateToLogin();
}
else
{
MessageBox.Show("Ошибка регистрации!");
}
}
else
{
MessageBox.Show("Пароли не совпадают или слишком короткие!");
}
}
private string ConvertSecureStringToString(SecureString secureString)
{
IntPtr unmanagedString = IntPtr.Zero;
try
{
unmanagedString = Marshal.SecureStringToGlobalAllocUnicode(secureString);
return Marshal.PtrToStringUni(unmanagedString);
}
finally
{
if (unmanagedString != IntPtr.Zero)
{
Marshal.ZeroFreeGlobalAllocUnicode(unmanagedString);
}
}
}
2 Replies
.
Here I get not data but a SecureString object
And the problem is that I can’t compare the password and I can’t pass the password to the server because it is an object of type SecureString. What should I do?
private bool IsPasswordValid()
{
if (Password == null || ConfirmPassword == null)
{
MessageBox.Show("Пароль и подтверждение пароля не могут быть пустыми.");
return false;
}
// Преобразуем SecureString в строку и сравниваем
string passwordStr = ConvertSecureStringToString(Password);
string confirmPasswordStr = ConvertSecureStringToString(ConfirmPassword);
return passwordStr.Length >= 8 && passwordStr == confirmPasswordStr;
}
private bool IsPasswordValid()
{
if (Password == null || ConfirmPassword == null)
{
MessageBox.Show("Пароль и подтверждение пароля не могут быть пустыми.");
return false;
}
// Преобразуем SecureString в строку и сравниваем
string passwordStr = ConvertSecureStringToString(Password);
string confirmPasswordStr = ConvertSecureStringToString(ConfirmPassword);
return passwordStr.Length >= 8 && passwordStr == confirmPasswordStr;
}
MessageBox.Show($"Password {passwordBox.SecurePassword} | {passwordBox.Password}");
MessageBox.Show($"Password {passwordBox.SecurePassword} | {passwordBox.Password}");
Binding to a PasswordBox's Password property in WPF · Antony Male
How to bind to a PasswordBox's Password property in WPF