You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms技术咨询:如何从另一Content Page获取Entry文本值

嘿,我来帮你解决这个在Xamarin.Forms里跨页面获取Entry文本的问题!你提到想用BindableProperty(因为用了Popup插件),那我先重点讲这个适配Popup场景的方案,再给你其他几个实用的选项~

方案一:用BindableProperty适配Popup场景

如果你的第二个页面是Popup(比如用Rg.Plugins.Popup这类常用插件),可以通过在Popup页面定义BindableProperty来接收或同步第一个页面Entry的文本:

步骤1:在Popup页面定义BindableProperty

假设你的Popup页面叫UserInfoPopup,在它的代码后台添加如下定义:

public partial class UserInfoPopup : PopupPage
{
    // 定义BindableProperty,用于接收用户名
    public static readonly BindableProperty UserNameProperty =
        BindableProperty.Create(nameof(UserName), typeof(string), typeof(UserInfoPopup), string.Empty);

    // 对应的CLR属性
    public string UserName
    {
        get => (string)GetValue(UserNameProperty);
        set => SetValue(UserNameProperty, value);
    }

    public UserInfoPopup()
    {
        InitializeComponent();
        // 把Popup自身设为绑定上下文,方便内部控件绑定这个属性
        BindingContext = this;
    }
}

步骤2:从第一个页面传递/绑定值

方式A:打开Popup时直接传入当前Entry的文本

适合只需要传递一次值的场景:

// 在第一个页面(比如FirstPage.xaml.cs)的打开Popup按钮点击事件里
private async void OpenPopupBtn_Clicked(object sender, EventArgs e)
{
    var popup = new UserInfoPopup();
    // 直接把Entry的Text赋值给Popup的UserName属性
    popup.UserName = UserName.Text;
    await Navigation.PushPopupAsync(popup);
}

方式B:实时绑定,Entry输入时Popup同步更新

如果需要Popup里的内容和Entry实时同步,就用绑定的方式:

private async void OpenPopupBtn_Clicked(object sender, EventArgs e)
{
    var popup = new UserInfoPopup();
    // 建立绑定,让Popup的UserName和Entry的Text双向同步
    popup.SetBinding(UserInfoPopup.UserNameProperty, new Binding("Text", source: UserName, mode: BindingMode.TwoWay));
    await Navigation.PushPopupAsync(popup);
}

这样在Popup里,你可以直接通过UserName属性拿到第一个页面Entry的实时文本,也能在Popup里修改这个值同步回Entry(如果用双向绑定的话)。

方案二:MVVM模式下用共享ViewModel(更优雅的长期方案)

如果你的项目是用MVVM架构,这种方式更利于维护,不用直接操作页面控件:

步骤1:创建共享的ViewModel

public class UserViewModel : INotifyPropertyChanged
{
    private string _userName;
    public string UserName
    {
        get => _userName;
        set
        {
            _userName = value;
            OnPropertyChanged();
        }
    }

    // 实现INotifyPropertyChanged接口
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

步骤2:全局共享ViewModel实例

在App.xaml.cs里定义一个静态的共享实例,这样所有页面都能访问:

public partial class App : Application
{
    // 全局共享的用户ViewModel
    public static UserViewModel SharedUserVM { get; } = new UserViewModel();

    public App()
    {
        InitializeComponent();
        MainPage = new NavigationPage(new FirstPage());
    }
}

步骤3:在第一个页面绑定Entry

在FirstPage.xaml里把Entry的Text绑定到ViewModel的UserName:

<Entry x:Name="UserName" Text="{Binding UserName}" Placeholder="enter your name" />

然后在FirstPage.xaml.cs的构造函数里设置绑定上下文:

public FirstPage()
{
    InitializeComponent();
    BindingContext = App.SharedUserVM;
}

步骤4:在第二个页面获取值

不管是普通ContentPage还是Popup,只要绑定同一个ViewModel,就能直接拿到值:

public SecondPage()
{
    InitializeComponent();
    BindingContext = App.SharedUserVM;
    
    // 随时可以获取最新的用户名
    string currentUserName = ((UserViewModel)BindingContext).UserName;
}
方案三:导航时直接传递参数(简单粗暴的一次性传递)

如果只是在跳转到第二个页面时传递一次值,这种方法最直接,不需要额外的绑定:

步骤1:第一个页面跳转时传参

private async void GoToSecondPageBtn_Clicked(object sender, EventArgs e)
{
    // 把Entry的Text作为参数传给第二个页面
    await Navigation.PushAsync(new SecondPage(UserName.Text));
}

步骤2:第二个页面接收参数

在第二个页面的构造函数里接收参数:

public partial class SecondPage : ContentPage
{
    public SecondPage(string userName)
    {
        InitializeComponent();
        // 这里就拿到了第一个页面Entry的文本
        Console.WriteLine($"获取到的用户名:{userName}");
        // 可以赋值给页面控件,比如Label
        UserNameLabel.Text = userName;
    }
}

内容的提问来源于stack exchange,提问作者hugokis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:17:44