Я пытался обдумать, как использовать реактиви для мониторинга свойств модели представления из определенного c экземпляра модели представления.
Например, у меня есть LoginView и LoginViewModel Я могу отслеживать изменения в LoginViewModel, привязывая LoginView к LoginViewModel, который работает, как и ожидалось.
Моя проблема связана с моим MainViewModel Я не могу получить доступ к LoginViewModel свойствам экземпляра для конкретного отслеживания изменений (AuthToken). То, что я пытаюсь сделать sh, - это то, что пользователь нажимает кнопку, получает ответ от сервера при получении ответа. Я хотел бы выполнить какое-либо действие в моем MainViewModel на основе значения свойства loginViewModel.
LoginView
public partial class LoginView : ReactiveUserControl<LoginViewModel>
{
public LoginView()
{
InitializeComponent();
{
this.WhenActivated(disposables =>
{
this.Bind(this.ViewModel, x => x.EMAIL, x => x.Email_TextBox.Text)
.DisposeWith(disposables);
this.Bind(this.ViewModel, x => x.ErrorPlaceHolder, x => x.Error.Content)
.DisposeWith(disposables);
this.BindCommand(ViewModel, x => x.LoginCommand, x => x.LoginButton)
.DisposeWith(disposables);
this
.passwordBox
.Events()
.PasswordChanged
.Select(_ => this.passwordBox.Password)
.Subscribe(x => this.ViewModel.PASSWORD = x)
.DisposeWith(disposables);
});
}
}
}
LoginViewModel
public class LoginViewModel : ReactiveObject, IRoutableViewModel
{
private readonly ReactiveCommand<Unit, Unit> loginCommand;
public string UrlPathSegment => "login";
public IScreen HostScreen { get; }
private string email;
private string password;
private string errorplaceholder;
private string authtoken;
private FirebaseAuthLink auth { get; set; }
public LoginViewModel(IScreen screen = null)
{
HostScreen = screen ?? Locator.Current.GetService<IScreen>();
var canExecute = this.WhenAnyValue(
x => x.EMAIL, x => x.PASSWORD, (EMAIL, PASSWORD) =>
!string.IsNullOrWhiteSpace(EMAIL) &&
!string.IsNullOrWhiteSpace(PASSWORD));
this.loginCommand = ReactiveCommand.CreateFromTask(
async () =>
{
ErrorPlaceHolder = "";
authtoken = await authLogin(EMAIL, PASSWORD);
Trace.WriteLine(errorplaceholder);
}, canExecute);
}
public ReactiveCommand<Unit, Unit> LoginCommand => this.loginCommand;
public string EMAIL
{
get => this.email;
set => this.RaiseAndSetIfChanged(ref this.email, value);
}
public string PASSWORD
{
get => this.password;
set => this.RaiseAndSetIfChanged(ref this.password, value);
}
public string ErrorPlaceHolder
{
get => this.errorplaceholder;
set => this.RaiseAndSetIfChanged(ref this.errorplaceholder, value);
}
public string AuthToken
{
get => this.authtoken;
set => this.RaiseAndSetIfChanged(ref this.authtoken, value);
}
public async Task<string> authLogin(string email, string password)
{
var authProvider = new FirebaseAuthProvider(new FirebaseConfig("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"));
try
{
auth = await authProvider.SignInWithEmailAndPasswordAsync(email, password);
var user = authProvider.GetUserAsync(auth);
Trace.WriteLine(auth.FirebaseToken);
return "true";
}
catch (Exception ex)
{
if (ex.Message.Contains("Reason: InvalidEmailAddress"))
{
ErrorPlaceHolder = "E-Mail address is invalid";
return ErrorPlaceHolder;
// // EmailErrorColour = "Red";
}
else if (ex.Message.Contains("Reason: WrongPassword"))
{
ErrorPlaceHolder = "E-Mail address or passowrd is incorrect!";
return ErrorPlaceHolder;
}
else if (ex.Message.Contains("Reason: UserDisabled"))
{
ErrorPlaceHolder = "Account is disabled";
return ErrorPlaceHolder;
}
else if (ex.Message.Contains("Reason: MissingPassword"))
{
ErrorPlaceHolder = "Missing Password";
return ErrorPlaceHolder;
}
else if (ex.Message.Contains("Reason: UnknownEmailAddress"))
{
ErrorPlaceHolder = "E-Mail address not found";
return ErrorPlaceHolder;
}
{
Console.WriteLine(ex.Message);
ErrorPlaceHolder = "Please contact the IT Department";
return ErrorPlaceHolder;
}
}
}
}
Любая помощь будет оценена спасибо.