данные не попадают в viewmodel при нажатии кнопки Icommand - PullRequest
0 голосов
/ 28 января 2019

У меня есть форма для сбора данных от пользователя.

 <StackLayout Spacing="10" Margin="20,10,20,0">
            <Label Text="Job Name"></Label>
            <Entry BackgroundColor="White" x:Name="JobName" Text="{Binding SelectedJob.Name,Mode=TwoWay}"/>
            <Label Text="Goal"></Label>
            <Entry BackgroundColor="White" x:Name="Goal" Text="{Binding SelectedJob.Goal,Mode=TwoWay}"/>
 <Grid ColumnSpacing="8" HorizontalOptions="FillAndExpand">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />

                </Grid.ColumnDefinitions>
                <Button Text="Save" Command="{Binding SubmitCommand}" BackgroundColor="#078fc1" Grid.Column="0" HorizontalOptions="FillAndExpand"/>
                <Button Text="Reset"  BackgroundColor="#078fc1" Grid.Column="1" HorizontalOptions="FillAndExpand"/>

            </Grid>         
</StackLayout>

при нажатии кнопки я хочу привязать данные к объекту SelectedJob.

это моя ViewModel

    public class JobViewModel: INotifyPropertyChanged
        {
    public JobViewModel()
            {
                SubmitCommand = new Command(OnSubmitAsync);

            }
 private JobDTO selectedob { get; set; }
        public JobDTO SelectedJob
        {
            get { return selectedob; }
            set
            {
                selectedob = value;
                OnPropertyChanged(nameof(SelectedJob));
            }
        }
    public ICommand SubmitCommand { protected set; get; }
            public async void OnSubmitAsync()
            {
                await.jobservice.postjob()
            }
}

и это моя модель

public class JobDTO:INotifyPropertyChanged
{
    private string name { get; set; }
    public string Name
    { get { return name;}
        set
        {
            name = value;
            OnPropertyChanged(nameof(Name));
        }
    }

    private string goal;

    public string Goal
    {
        get { return goal; }
        set
        {
            goal = value;
            OnPropertyChanged(nameof(Goal));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

при нажатии кнопки я получаю SelectedJob как ноль, хотя я сделал свой класс как JobDTO: INotifyPropertyChanged.can любой помочь мне, что я делаю здесь неправильно.

1 Ответ

0 голосов
/ 29 января 2019

Я изменил код ViewModel и модель.Существует GIF демо на основе вашего кода.

enter image description here

ViewModel из JobViewModel

Если вы хотите использовать get/setметод, один атрибут соответствует одному методу get / set, я также добавляю метод OnPropertyChanged.

    public class JobViewModel : INotifyPropertyChanged
{
    public JobViewModel()
    {
        SubmitCommand = new Command(OnSubmitAsync);

    }


    private JobDTO selectedob=new JobDTO();
    public JobDTO SelectedJob
    {
        get { return selectedob; }
        set
        {
            selectedob = value;
            OnPropertyChanged("SelectedJob");
        }
    }
    public ICommand SubmitCommand { protected set; get; }

    public event PropertyChangedEventHandler PropertyChanged;

    public async void OnSubmitAsync()
    {


        // i donnot know what is your aim of this part, i just pop up a alert that contains Name and Goal from Entry.
        await Application.Current.MainPage.DisplayAlert("Alert", "Name: "+SelectedJob.Name+"\n"+ "Goal: "+ SelectedJob.Goal , "Ok");


    }

    protected virtual void OnPropertyChanged(string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null)
        {

            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

    }

}

Модель JobDTO, измененное место совпадает с ViewModel

    public class JobDTO: INotifyPropertyChanged
{

    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    private string goal;

    public string Goal
    {
        get { return goal; }
        set
        {
            goal = value;
            OnPropertyChanged("Goal");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;


    protected virtual void OnPropertyChanged(string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null)
        {

            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

    }

}

MainPage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:DateBoundingDemo"
         x:Class="DateBoundingDemo.MainPage">


<StackLayout Spacing="10" Margin="20,10,20,0">

    <Label Text="Job Name"></Label>
    <Entry BackgroundColor="White" x:Name="JobName" Text="{Binding SelectedJob.Name,Mode=TwoWay}"/>
    <Label Text="Goal"></Label>
    <Entry BackgroundColor="White" x:Name="Goal" Text="{Binding SelectedJob.Goal,Mode=TwoWay}"/>
    <Grid ColumnSpacing="8" HorizontalOptions="FillAndExpand">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />

        </Grid.ColumnDefinitions>
        <Button Text="Save" Command="{Binding SubmitCommand}" BackgroundColor="#078fc1" Grid.Column="0" HorizontalOptions="FillAndExpand"/>
        <Button Text="Reset"  BackgroundColor="#078fc1" Grid.Column="1" HorizontalOptions="FillAndExpand"/>
     </Grid>
 </StackLayout>


</ContentPage>

MainPage.xaml.cs

    public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        BindingContext =new JobViewModel();
    }
}
...