контролировать изменение свойства viewmodel из другой viewmodel, используя реактивный интерфейс - PullRequest
0 голосов
/ 10 марта 2020

Я пытался обдумать, как использовать реактиви для мониторинга свойств модели представления из определенного 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;

            }
        }
    }


}

Любая помощь будет оценена спасибо.

...