首页 > 解决方案 > 将参数从视图模型传递到页面并显示它

问题描述

我坚持将参数从视图模型传递到页面。在视图模型页面上,我有按按钮增加的属性列表,在按钮单击总和显示在下面的同一页面上之后,我收集了很多东西,我的目标是将在此视图模型页面上收集的总和发送到新页面我想负责显示这笔款项。我坚持传递参数,它只是不更新​​值,看起来绑定是好的,因为应用程序不会抛出对象没有引用的异常。我是 xamarin 的初学者,对于我可以遵循的任何解释或方向来实现这一点,我将不胜感激。先感谢您 :)

列表视图模型代码:

    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();
    }
}

标签: c#mvvmxamarin.formscommandparameter-passing

解决方案


您需要接收您在视图模型中传递的对象。

public CounterViewModel(PersonListViewModel personList)
            {
                PersonList =  personList;

            }

推荐阅读