如何使用命令中的mvvm属性将选择器值保存到Web api?

问题描述

我有一个xamarin表单应用程序,想保存一些通过Web api从选择器获得的值。目的是保存此值以及链接sql server数据库的Web api中的其他属性,但是我在如何通过mvvm引用选择器中选择的值方面遇到问题。我可以从选择器中加载数据,但是我只是不知道如何通过在mvvm中引用选择器来保存这些值。

UsuarioModel类 这是模型类,它具有CodPerfil属性,该属性是应该存储在我的Web api数据库中的外键,并且必须对应于将在选择器中选择的值。

public class UsuarioModel
    {
        public int CodUsuario { get; set; }
        public string Nome { get; set; }
        public string Senha { get; set; }
        public int Telefone { get; set; }
        public DateTime DataRegisto { get; set; }
        public bool Estado { get; set; }
        public int CodPerfil { get; set; }
    }

PerfilModel类

public class PerfilModel
    {
        public int CodPerfil { get; set; }
        public string Titulo { get; set; }
    }

要插入数据的Web API控制器

public IHttpActionResult Registo(UsuarioModel usuario)
        {
            connection();
            sqlCommand cmd = new sqlCommand("SpAddNewUser",conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Nome",usuario.Nome);
            cmd.Parameters.AddWithValue("@Senha",usuario.Senha);
            cmd.Parameters.AddWithValue("@Telefone",usuario.Telefone);
            cmd.Parameters.AddWithValue("@CodPerfil",usuario.CodPerfil);
            conn.open();
            cmd.ExecuteNonQuery();
            return Ok();
        }

Web API控制器以获取Xamarin中的选择器数据

public IEnumerable<PerfilModel> GetPerfisApp()
        {
            List<PerfilModel> perfilModels = new List<PerfilModel>();

            connection();

            sqlCommand cmd = new sqlCommand("SpGetPerfilApp",conn);
            cmd.CommandType = CommandType.StoredProcedure;
            conn.open();

            sqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                PerfilModel perfil = new PerfilModel();
                perfil.CodPerfil = Convert.ToInt32(reader["CodPerfil"]);
                perfil.Titulo = reader["Titulo"].ToString();

                perfilModels.Add(perfil);
            }
            conn.Close();
            return perfilModels;
        }

viewmodel类

public class AddRegistoUsuarioviewmodel : Baseviewmodel
    {
        ApiServices _apiServices = new ApiServices();

        string _nome;
        public string Nome
        {
            get
            {
                return _nome;
            }
            set
            {
                if (value != null)
                {
                    _nome = value;
                    OnPropertyChanged();
                }
            }
        }
        string _senha;
        public string Senha
        {
            get
            {
                return _senha;
            }
            set
            {
                if (value != null)
                {
                    _senha = value;
                    OnPropertyChanged();
                }
            }
        }
        int _telefone;
        public int Telefone
        {
            get
            {
                return _telefone;
            }
            set
            {
                    _telefone = value;
                    OnPropertyChanged();
            }
        }
        int _codperfil;
        public int CodPerfil
        {
            get
            {
                return _codperfil;
            }
            set
            {
                _codperfil = value;
                OnPropertyChanged();
            }
        }
        public string Message { get; set; }

        public ICommand Registar
        {
            get
            {
                return new Command(async () =>
                {
                    var usuario = new UsuarioModel
                    {
                        Nome = Nome,Senha = Senha,Telefone = Telefone,CodPerfil = SelectedPerfil.CodPerfil
                    };
                    await _apiServices.RegistoUsuarioAsync(usuario);
                });
            }
        }

        public AddRegistoUsuarioviewmodel()
        {
            GetPerfisApp();
        }
        public async void GetPerfisApp()
        {
            using (var client = new HttpClient())
            {
                var uri = "https://webapiigarbage-ff4.conveyor.cloud/api/Usuario/PerfisApp";
                var result = await client.GetStringAsync(uri);
                var PerfilList = JsonConvert.DeserializeObject<List<PerfilModel>>(result);
                Perfis = new ObservableCollection<PerfilModel>(PerfilList);
            }
        }

        PerfilModel _selectedPerfil;
        public PerfilModel SelectedPerfil
        {
            get
            {
                return _selectedPerfil;
            }
            set
            {
                if (SelectedPerfil != value)
                {
                    _selectedPerfil = value;
                    OnPropertyChanged();
                }
            }
        }


        ObservableCollection<PerfilModel> _perfis;
        public ObservableCollection<PerfilModel> Perfis
        {
            get
            {
                return _perfis;
            }
            set
            {
                _perfis = value;
                OnPropertyChanged();
            }
        }
    }

API服务类别 我尝试使用这种形式:CodPerfil = SelectedPerfil.CodPerfil 但是我没有成功。

public async Task RegistoUsuarioAsync(UsuarioModel usuario)
        {
            var client = new HttpClient();

            var json = JsonConvert.SerializeObject(usuario);

            HttpContent content = new StringContent(json);

            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var response = await client.PostAsync("https://mywebsite/api/Usuario/Registo",content);
        }

RegisterPage.xaml.cs

public RegisterPage()
        {
            InitializeComponent();
            BindingContext = new RegistoUsuarioviewmodel();
        }

RegisterPage.xaml


            <Entry Placeholder="Nome de Usuário" 
          x:Name="NomeEntry" />
            <Picker x:Name="PerfilPicker" Title="Selecione o seu Perfil" FontSize="Large" HorizontalOptions="Center"
                    ItemsSource="{Binding Perfis}" 
                    ItemdisplayBinding="{Binding Titulo}" 
                    SelectedItem="{Binding SelectedPerfil}" />
            <Entry Placeholder="Número de Telemóvel" 
          x:Name="TelefoneEntry"
          Keyboard="Telephone"/>
            <Entry Placeholder="Senha" x:Name="SenhaEntry" IsPassword="True"/>
            <Button Text="Registar"
           TextColor="White" 
           BackgroundColor="#07E3B0"
           x:Name="ButtonLogin"
                    Command="{Binding Registar}"/>

如果有人可以帮助我,我将不胜感激。

解决方法

感谢您的提示。发生的是,在Register.xaml.cs类中绑定的视图模型不是包含Register命令的视图模型。我通过替换视图模型解决了“问题”,它起作用了!

RegisterPage.xaml.cs

public RegisterPage()
        {
            InitializeComponent();
            BindingContext = new AddRegistoUsuarioViewModel();
        }