我一直在努力思考如何使用reactui监视特定视图模型实例中的视图模型属性。
例如,我有一个 LoginView 和一个 LoginViewModel ,我可以通过将LoginView绑定到LoginViewModel来监视LoginViewModel的更改,该更改可以按预期工作。
我的问题是我的 MainViewModel ,我无法访问 LoginViewModel 实例属性来专门监视更改(AuthToken)。我要完成的工作是用户单击按钮后会收到来自服务器的响应,我想根据loginViewModel属性值在MainViewModel中执行一些操作。 >
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;
}
}
}
}
任何帮助将不胜感激。