Просмотр в MVVM, возвращающий нулевые значения при вставке данных - PullRequest
0 голосов
/ 04 мая 2020

У меня есть приложение Xamarin.Forms, где я использую MVVM на странице регистрации для вставки данных в базу данных. Проблема в том, что каждый раз, когда я пытаюсь это сделать, я получаю нулевые значения из представления, хотя привязка между View и ViewModel все в порядке. Снимок экрана со значениями после запуска SignUpCommand Null Values.

Просмотр:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:l="clr-namespace:projectese.viewmodels" 
             x:Class="everyday.Views.SignUpPage">
    <ContentPage.BindingContext>
        <l:SignUpViewModel/>
    </ContentPage.BindingContext>
    <ContentPage.Content>
        
<StackLayout Margin="20,0" BackgroundColor="Black" IsVisible="True">
<Label Text="Welcome!" TextColor="White" HorizontalTextAlignment="Center"  />

<StackLayout BackgroundColor="White">
<Entry Placeholder="Name" Text="{Binding Name,Mode=TwoWay}" x:Name="UserName" />
<Entry Placeholder="Email" Text="{Binding Email,Mode=TwoWay}" x:Name="email" />
<Entry Placeholder="Phone" Text="{Binding Phone,Mode=TwoWay}" x:Name="phone" />
<Entry Placeholder="Password" Text="{Binding Password,Mode=TwoWay}" x:Name="pwd" />
<Entry Placeholder="Confirm Password" Text="{Binding ConfPassword,Mode=TwoWay}" x:Name="confPwd" />
<Button Text="Sign Up" Command="{Binding SignUpCommand}"/>
</StackLayout>
</StackLayout>

    </ContentPage.Content>
</ContentPage>

Модель представления:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Input;
using projectese.models;
using Xamarin.Forms;

namespace projectese.viewmodels
{
    public class SignUpViewModel:BaseViewModel
    {
        private Users user { get; set; }
        public ICommand SignUpCommand { get; private set; }
       
        public SignUpViewModel()
        {
            user = new Users();
            SignUpCommand = new Command(async() => await AddUser());
        }
       
        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                if(name!=null)
                {
                   
                    name = value;
                    NotifyPropertyChanged("Name");
                }
            }
        }
        private string email;
        public string Email
        {
            get { return email; }
            set
            {
                if(email!=null)
                {
                    email = value;
                    NotifyPropertyChanged("Email");
                }
            }
        }   
        private string password;
        public string Password
        {
            get { return password; }
            set
            {
                if(password!=null)
                {
                    password = value;
                    NotifyPropertyChanged("Password");
                }
            }
        }
        private string confPassword;
        public string ConfPassword
        {
            get { return confPassword; }
            set
            {
                if(confPassword !=null)
                {
                    confPassword = value;
                    NotifyPropertyChanged("ConfPassword");
                }
            }
        }
        private string phone;
        public string Phone
        {
            get { return phone; }
            set
            {
               if(phone!=null)
                {
                    phone = value;
                    NotifyPropertyChanged("Phone");
                }
            }
        }
     
        public async Task AddUser()
        {
            bool isUserAccept = await Application.Current.MainPage.DisplayAlert("Add contact","Do you want to sign up?","OK","Cancel");
            if(isUserAccept)
            { 
            App.Database.AddUser(new Users {Name=user.Name,Email=user.Email,Password=user.Password,ConfPassword=user.ConfPassword,Phone=user.Phone});
                await Application.Current.MainPage.DisplayAlert("Your data is saved","Welcome" + user.Name, "OK", "Cancel");
            }
            else
            {
                await Application.Current.MainPage.DisplayAlert("Something went wrong,please try again!","OK", "Cancel");
            }
        }
        public void RemoveUser (int id)
        {
            App.Database.RemoveUser(id);
        }

      
    }
}
Модель:

using System;
using SQLite;

namespace projectese.models
{
    public class Users
    {
        [PrimaryKey,AutoIncrement,NotNull]
        public int Id { get; set; }
        [NotNull]
        public string Name { get; set; }
        [NotNull]
        public string Phone { get; set; }
        [NotNull]
        public string Email { get; set; }
        [NotNull]
        public string Password { get; set; }
        [NotNull]
        public string ConfPassword { get; set; }
        public Users()
        {
        }
    }
}

Кто-нибудь знает, почему это может произойти? Любая помощь будет признательна!

1 Ответ

1 голос
/ 04 мая 2020

вы привязываетесь к свойствам ViewModel, а не к свойствам объекта user

<Entry Placeholder="Name" Text="{Binding Name}" />

, если вы хотите привязать к user объекту ViewModel, к этому

<Entry Placeholder="Name" Text="{Binding user.Name}" />

вам также нужно будет опубликовать свой user объект c

public Users user { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...