如何在Xamarin PCL项目中从视图中调用Model的方法

时间:2017-03-31 08:07:32

标签: xamarin methods code-behind printer-control-language

我想调用一个位于class LoginViewModel的方法,但它是不可能的。如何从Login.xaml.cs代码后面访问它,以便我可以调用Connexion()方法?

Login.xaml

<Button 
            StyleId="btn_connexion"
            Text="Connexion"
                Clicked="Connexion_click" />

Login.xaml.cs

private void Connexion_click(object sender, EventArgs e)
        {
           //here is where i'd like to call the connexion method 
        }

LoginViewModel.cs

public async Task Connexion()
        {

            List<Visiteur> listeTest = CreerListeVisiteurDur();
            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
            {
                foreach (Visiteur unVisiteur in listeTest)
                {
                    string login = unVisiteur.login;
                    string pass = unVisiteur.mdp;

                    if (login == username && pass == password)
                    {
                        App.Current.MainPage = new CreerVisite();
                    }

                }
            }

2 个答案:

答案 0 :(得分:0)

我认为你应该使用&#34; Binding&#34;使用命令,而不是单击

类似

<Button 
            StyleId="btn_connexion"
            Text="Connexion"
                Command="{Binding OpenPageCommand}" />

和你的ViewModel类似

    this.OpenPageCommand = new Command(async () => {
        try { 
                        List<Visiteur> listeTest = CreerListeVisiteurDur();
    if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
    {
        foreach (Visiteur unVisiteur in listeTest)
        {
            string login = unVisiteur.login;
            string pass = unVisiteur.mdp;

            if (login == username && pass == password)
            {
                App.Current.MainPage = new CreerVisite();
            }

        }
    }

        }
        catch (Exception ex) {
            await Application.Current.MainPage.DisplayAlert("Attention", ex.Message, "Ok");
        }
    });

答案 1 :(得分:0)

我同意{{3}}关于您选择的设计模式;但是,您可以使用下面的代码来实现您的要求。

<强> BtnClicker.xaml.cs

 namespace BountyApp.Pages
{

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class BtnClicker : ContentPage
    {
        BtnClickerViewModel model = new BtnClickerViewModel();
        public BtnClicker()
        {
            InitializeComponent();
            BindingContext = model;

        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                await model.Connexion();
            });

        }
    }

    class BtnClickerViewModel : INotifyPropertyChanged
    {
        public async Task Connexion()
        {
            List<Visiteur> listeTest = CreerListeVisiteurDur();
            if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
            {
                foreach (Visiteur unVisiteur in listeTest)
                {
                    string login = unVisiteur.login;
                    string pass = unVisiteur.mdp;

                    if (login == username && pass == password)
                    {
                        App.Current.MainPage = new CreerVisite();
                    }

                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        void OnPropertyChanged([CallerMemberName]string propertyName = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }
}

<强> BtnClicker.xaml
这个按钮很大,所以你需要适当调整它。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="BountyApp.Pages.BtnClicker"
             Title="BtnClicker">
    <Button StyleId="btn_connexion" Text="Connexion" Clicked="Button_Clicked"></Button>
</ContentPage>