簡體   English   中英

我有一個關於 Xamarin.Forms 導航的問題。 如何將變量值從一頁傳遞到另一頁?

[英]I have a question regarding Xamarin.Forms Navigation. How to pass variable values from one page to other?

我有一個帶有以下集合視圖的 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的 label 字段中

DetailPage.xaml 有一個 label 字段為

<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 或注釋具有空值。

根據您的描述,您想在 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 class,繼承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);
    }
}

第二個內容頁:

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

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

截圖:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM