У меня вопрос по Xamarin.Forms Navigation. Как передать значения переменных с одной страницы на другую? - PullRequest
1 голос
/ 18 апреля 2020

У меня есть файл MainPage.xaml со следующим представлением коллекции

<CollectionView ItemsSource="{Binding AllNotes}" 
                            SelectionMode="Single"
                            SelectedItem="{Binding SelectedNote}"
                            SelectionChangedCommand="{Binding SelectedNoteChangedCommand}"
                            Grid.Row="2" Grid.ColumnSpan="2">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout>
                            <Frame>
                                <Label Text="{Binding .}" FontSize="Title"/>
                            </Frame>
                        </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

В файле MainPageView.cs я взял значение выбранной заметки, используя следующий код

public string selectedNote;
public string SelectedNote
{
    get => selectedNote;
    set
    {
        selectedNote = value;

        var args = new PropertyChangedEventArgs(nameof(SelectedNote));

        PropertyChanged?.Invoke(this, args);
    }
}

SelectedNoteChangeCommand перенаправляет на DetailPage, где должна быть напечатана выбранная заметка. SelectedNoteChangeCommand имеет следующий код

SelectedNoteChangedCommand = new Command(async () =>
    {
        var detailVM = new ListPageViewDetail.DetailPageView(SelectedNote);
        var detailPage = new List.DetailPage();

        detailPage.BindingContext = detailVM;
        await Application.Current.MainPage.Navigation.PushAsync(detailPage);
    });

Теперь, если я отображаю значение SelectedNote на той же странице, оно отображается, но не отображается в поле метки в DetailPage

DetailPage.xaml имеет поле метки как

<Label Text="{Binding NoteText}" FontSize="Title" Grid.Row="0"
                   VerticalOptions="CenterAndExpand"
                   HorizontalOptions="CenterAndExpand" />

Файл DetailPageView.cs имеет конструктор как

public DetailPageView(string note)
{
    NoteText = note;
    DismissPageCommand = new Command(async () =>
        {
            await Application.Current.MainPage.Navigation.PopAsync();
        });
}

Теперь я хочу спросить, как передать SelectedNote значение переменной для других страниц? NoteText или примечание имеет пустое значение.

1 Ответ

0 голосов
/ 20 апреля 2020

Согласно вашему описанию, вы хотите передать значение между ContentPage, я создаю пример, который вы можете посмотреть.

Первый COntentPage:

 <CollectionView
            ItemsLayout="VerticalList"
            ItemsSource="{Binding AllNotes}"
            SelectedItem="{Binding selectednote}"
            SelectionChangedCommand="{Binding SelectedNoteChangedCommand}"
            SelectionMode="Single">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout>
                        <Label Text="{Binding .}" />
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

 public partial class Page4 : ContentPage, INotifyPropertyChanged
{
    public  ObservableCollection<string> AllNotes { get; set; }
    private string _selectednote;
    public string selectednote
    {
        get { return _selectednote; }
        set
        {
            _selectednote = value;
            RaisePropertyChanged("selectednote");
        }
    }

    public RelayCommand1 SelectedNoteChangedCommand { get; set; }
    public Page4()
    {
        InitializeComponent();
        AllNotes = new ObservableCollection<string>()
        {
            "test 1",
            "test 2",
           "test 3",
            "test 4",
            "test 5",
            "test 6"

        };
        selectednote = AllNotes[0];
        SelectedNoteChangedCommand = new RelayCommand1(obj=>passdata((string)selectednote));
        this.BindingContext = this;
    }

    private void passdata(string selectednote)
    {
        Navigation.PushAsync(new Page5(selectednote));
    }
    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Класс RelayCommand1, наследующий ICommand , который может передавать параметр.

public class RelayCommand1 : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public RelayCommand1(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand1(Action<object> execute, Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged;


    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}

Второй ContentPage:

 <StackLayout>
        <Label
            HorizontalOptions="CenterAndExpand"
            Text="{Binding .}"
            VerticalOptions="CenterAndExpand" />
    </StackLayout>

  public Page5(string str)
    {
        InitializeComponent();
        this.BindingContext = str;
    }

Скриншот:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...