Передача параметра из view-model на страницу и отображение его - PullRequest
0 голосов
/ 15 января 2019

Я застрял с передачей параметра от модели представления к странице. На странице просмотра модели у меня есть список свойств, которые я увеличиваю по кнопке, после того, как сумма нажатий кнопки отображается на той же странице, что и я, что я собирал, моя цель состоит в том, чтобы отправить эту сумму, собранную на этой странице модели просмотра, на новую страницу, которая Я хочу нести ответственность за отображение этой суммы. Я застрял с передачей параметра, он просто не обновляет значение, похоже, что привязка не работает, потому что приложение не выдает исключение, что объект не имеет ссылки. Я начинающий в xamarin и за любое объяснение или просто направление, которому я могу следовать, чтобы достигнуть этого, я был бы очень признателен. Заранее спасибо:)

Код ListViewModel:

    public class PersonListViewModel : INotifyPropertyChanged
{
    public ObservableCollection<PersonViewModel> Persons { get; set; }

    PersonViewModel selectedPerson;

    double _sumcollected;
    public double SumCollected
    {
        get => _sumcollected;
        set
        {
            if (_sumcollected != value)
            {
                _sumcollected = value;
                OnPropertyChanged("SumCollected");
            }
        }
    }


    public INavigation Navigation { get; set; }

    public PersonListViewModel()
    {
        Persons = new ObservableCollection<PersonViewModel>
        {
            new PersonViewModel()
            {
                Name="Test", Surname="Test", Description= "TEsT", Background = "bgtest6.jpg", ProgressCounter =0.1, SavedClicked=0,Weight=1
            },
            new PersonViewModel()
            {
                Name="Test", Surname="Test", Description= "TEsT",Background = "bgtest6.jpg", ProgressCounter =0.1, SavedClicked=0,Weight=30
            },
            new PersonViewModel()
            {
                Name="Test", Surname="Test", Description= "TEsT",Background = "bgtest6.jpg", ProgressCounter =0.2, SavedClicked=0,Weight=100
            },
            new PersonViewModel()
            {
                Name="Test", Surname="Test", Description= "TEsT",Background = "bgtest6.jpg", ProgressCounter =0.3, SavedClicked=0,Weight=27
            },
        };
        NavigateCommand = new Command<PersonViewModel>(NavigatationSolved);
        IncreaseProgressCommand = new Command<PersonViewModel>(IncreaseProgress);
        GotoCounterCommand = new Command<PersonListViewModel>(GotoNumbersPage);
        NavigateSumPageCommand = new Command<PersonListViewModel>(NavigateSumPage);

    }

    private void NavigateSumPage(object obj)
    {
        Debug.WriteLine("Navigate to sum page ");
        PersonListViewModel personListModel = obj as PersonListViewModel;
        Navigation.PushAsync(new SumPage(personListModel));
    }

    //Passing SumCollected not working
    private void GotoNumbersPage(object numbers)
    {
        PersonListViewModel personList = numbers as PersonListViewModel;

        Navigation.PushAsync(new CounterPage(personList));
        Debug.WriteLine("Next Page ?");
    }


    private void IncreaseProgress(object sender)
    {

        PersonViewModel person = sender as PersonViewModel;

        if(person.ProgressCounter >= 1)
        {
            person.ProgressCounter -= person.ProgressCounter;
            Application.Current.MainPage.DisplayAlert("Alert!", "Message after one progress bar", "GO!");
        }
        else
        {
            person.ProgressCounter += .2;
        }
        //Navigation.PushPopupAsync(new GratulationAlertPage());
        person.SavedClicked += 1;
        Debug.WriteLine("Saved Clicked");
        SumCollected += 1;
        SumCollected += person.Weight;
        Debug.WriteLine("New SumCollected value");
    }

}

Код ListViewModelPage:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="CommandDemo.Views.PersonListPage"
         >
<NavigationPage.TitleView>
    <StackLayout Orientation="Horizontal">
        <Button Text="Numbers"
                Command="{Binding Path=BindingContext.GotoCounterCommand}"
                CommandParameter="{Binding .}"/>
    </StackLayout>
</NavigationPage.TitleView>
<ContentPage.Content>
    <StackLayout Padding="10"
                 Margin="10">
        <ListView x:Name="personList"
                  ItemsSource="{Binding Persons}"
                  HasUnevenRows="True"
                  >
            <!--SelectedItem="{Binding SelectedPerson}"-->
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>

                        <StackLayout>
                            <StackLayout.GestureRecognizers>
                                <TapGestureRecognizer NumberOfTapsRequired="1"
                                                      Command="{Binding Source={x:Reference personList},Path=BindingContext.NavigateCommand}"
                                                      CommandParameter="{Binding .}"/>
                            </StackLayout.GestureRecognizers>
                            <Label Text="{Binding Name}"
                               HorizontalTextAlignment="Center"
                               VerticalTextAlignment="Center"
                               HorizontalOptions="Center"
                               VerticalOptions="Center"
                               Margin="5,5,5,5"/>
                            <ProgressBar Progress="{Binding ProgressCounter}"/>
                            <Button Text="Add Progress"
                                    Command="{Binding Source={x:Reference personList},Path=BindingContext.IncreaseProgressCommand}"
                                    CommandParameter="{Binding .}"/>
                        </StackLayout>

                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Label Text="{Binding SumCollected}"
               VerticalTextAlignment="Center"
               HorizontalTextAlignment="Center"
               VerticalOptions="Center"
               HorizontalOptions="Center"/>
        <Button Text="Numbers"
                Command="{Binding NavigateSumPageCommand}"
                CommandParameter="{Binding .}"/>
    </StackLayout>
</ContentPage.Content>

Код SumViewModel:

    public class CounterViewModel : INotifyPropertyChanged
{
        private PersonListViewModel _personListView;
        public PersonListViewModel PersonList
        {
            get => _personListView;
            set
            {
                if (_personListView != value)
                {
                    _personListView = value;
                    OnPropertyChanged("PersonList");
                }
            }
        }

        PersonViewModel _personView;
        public PersonViewModel PersonView
        {
            get => _personView;
            set
            {
                if (_personView != value)
                {
                    _personView = value;
                    OnPropertyChanged("PersonView");
                }
            }
        }
        public double SumCollected
        {
            get => PersonList.SumCollected;
            set
            {
                if (PersonList.SumCollected != value)
                {
                    PersonList.SumCollected = value;
                    OnPropertyChanged("SumCollected");
                }
            }
        }
        private double _collected;
        public double Collected
        {
            get => _collected;
            set
            {
                if (_collected != value)
                {
                    _collected = value;
                    OnPropertyChanged("Collected");
                }
            }
        }

        public CounterViewModel()
        {
            PersonList = new PersonListViewModel();

        }
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
}

Страница, на которой я хочу отобразить сумму, собранную со страницы списка:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="CommandDemo.Views.SumPage">
<ContentPage.Content>
    <StackLayout>
        <Label Text="{Binding PersonList.SumCollected}"
            VerticalOptions="CenterAndExpand" 
            HorizontalOptions="CenterAndExpand" />
    </StackLayout>
</ContentPage.Content>

Код страницы суммы позади:

    public partial class SumPage : ContentPage
{
    public SumPage (PersonListViewModel personListModel)
    {
        InitializeComponent ();
        BindingContext = new CounterViewModel();
    }
}

1 Ответ

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

Вам необходимо получить объект, который вы передаете в своей модели просмотра.

public CounterViewModel(PersonListViewModel personList)
            {
                PersonList =  personList;

            }
...