问题描述
我有一个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();
}