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

MAUI页面加载时如何通过参数加载数据?

解决MAUI页面跳转传参加载对象及UI更新问题

方案1:利用QueryProperty的Setter触发对象加载

ViewModel里的Id属性需手动实现setter逻辑,在属性值变更时直接触发对象加载,同时确保Habit属性实现属性变更通知:

public class HabitViewModel : INotifyPropertyChanged
{
    private int _id;
    private Habit _habit;

    [QueryProperty("Id", "Id")]
    public int Id
    {
        get => _id;
        set
        {
            if (_id != value)
            {
                _id = value;
                LoadHabitById(_id);
                OnPropertyChanged(nameof(Id));
            }
        }
    }

    public Habit Habit
    {
        get => _habit;
        set
        {
            if (_habit != value)
            {
                _habit = value;
                OnPropertyChanged(nameof(Habit));
            }
        }
    }

    private void LoadHabitById(int id)
    {
        // 替换为你的列表查询或数据库读取逻辑
        var loadedHabit = YourHabitDataSource.FirstOrDefault(h => h.id == id);
        Habit = loadedHabit;
    }

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

方案2:修复OnAppearing命令的UI更新问题

如果坚持通过页面生命周期事件触发加载,需满足两个核心条件:

  1. Habit属性的setter必须触发PropertyChanged事件(同方案1的实现)
  2. 确保命令执行时Id已被QueryProperty赋值(QueryProperty在页面构造后、OnAppearing前完成赋值)

页面XAML绑定命令:

<ContentPage ...
             xmlns:vm="clr-namespace:YourProjectNamespace.ViewModels"
             x:DataType="vm:HabitViewModel">
    <ContentPage.Behaviors>
        <behaviors:EventToCommandBehavior
            EventName="Appearing"
            Command="{Binding LoadHabitCommand}" />
    </ContentPage.Behaviors>
    <!-- 页面绑定示例 -->
    <Label Text="{Binding Habit.Name}" />
</ContentPage>

ViewModel中的命令实现:

public ICommand LoadHabitCommand { get; }

public HabitViewModel()
{
    LoadHabitCommand = new Command(ExecuteLoadHabit);
}

private void ExecuteLoadHabit()
{
    if (Id <= 0) return;
    var loadedHabit = YourHabitDataSource.FirstOrDefault(h => h.id == Id);
    Habit = loadedHabit;
}

关键注意事项

  • ViewModel必须实现INotifyPropertyChanged接口,所有绑定属性(包括Habit)在赋值时必须调用OnPropertyChanged,否则UI不会响应数据更新。
  • QueryProperty的赋值时机是页面构造完成后,OnAppearing执行前,因此在Id的setter中触发加载是最直接可靠的方式,无需依赖页面生命周期事件。
  • 避免手动给Habit赋固定初始值(除非作为占位默认值),否则加载新对象时需确保属性变更通知被正确触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:40:00