如何为ShellContent绑定的AssignedTasksPage传递构造函数参数
解决方案:给ShellContent传递构造参数到AssignedTasksPage
崩溃原因
你的AssignedTasksPage仅实现了带string tab参数的构造函数,但Shell通过DataTemplate创建页面实例时,默认会尝试调用无参构造函数,因找不到对应构造方法导致应用崩溃。
方法一:通过x:Arguments直接传递构造参数(推荐)
修改ShellContent的XAML代码,在DataTemplate中显式实例化AssignedTasksPage并传入对应的tab参数:
<ShellContent Icon="userblanco.png" Shell.NavBarIsVisible="False" Title="Tareas Asignadas" Route="assignedTasks"> <ShellContent.ContentTemplate> <DataTemplate> <local:AssignedTasksPage> <x:Arguments> <x:String>assignedTasks</x:String> </x:Arguments> </local:AssignedTasksPage> </DataTemplate> </ShellContent.ContentTemplate> </ShellContent> <ShellContent Icon="encursoblanco.png" Shell.NavBarIsVisible="False" Title="Tareas En Curso" Route="inProgressTasks"> <ShellContent.ContentTemplate> <DataTemplate> <local:AssignedTasksPage> <x:Arguments> <x:String>inProgressTasks</x:String> </x:Arguments> </local:AssignedTasksPage> </DataTemplate> </ShellContent.ContentTemplate> </ShellContent> <ShellContent Icon="tareasblanco.png" Shell.NavBarIsVisible="False" Title="Tareas Finalizadas" Route="completedTasks"> <ShellContent.ContentTemplate> <DataTemplate> <local:AssignedTasksPage> <x:Arguments> <x:String>completedTasks</x:String> </x:Arguments> </local:AssignedTasksPage> </DataTemplate> </ShellContent.ContentTemplate> </ShellContent>
这种方式完全匹配你原有的构造传参逻辑,不需要修改页面的C#代码。
方法二:添加无参构造,通过路由路径判断tab
如果不想修改XAML结构,可以给AssignedTasksPage添加无参构造,在页面初始化时通过Shell的当前路由路径判断要加载的tab:
1. 修改页面C#代码
// 添加无参构造,兼容Shell的DataTemplate创建逻辑 public AssignedTasksPage() { InitializeComponent(); _viewModel = new MvTareas(); BindingContext = _viewModel; // 根据当前路由路径判断要显示的tab var currentRoute = Shell.Current.CurrentState.Location.OriginalString; if (currentRoute.Contains("assignedTasks")) { _viewModel.ShowAsignadas(); } else if (currentRoute.Contains("inProgressTasks")) { _viewModel.ShowEnCurso(); } else if (currentRoute.Contains("completedTasks")) { _viewModel.ShowFinalizadas(); } else { _viewModel.ShowAsignadas(); } } // 保留原有带参构造,兼容其他页面跳转场景 public AssignedTasksPage(string tab) { InitializeComponent(); _viewModel = new MvTareas(); BindingContext = _viewModel; if (!string.IsNullOrEmpty(tab)) { switch (tab) { case "assignedTasks": _viewModel.ShowAsignadas(); break; case "inProgressTasks": _viewModel.ShowEnCurso(); break; case "completedTasks": _viewModel.ShowFinalizadas(); break; default: _viewModel.ShowAsignadas(); break; } } }
2. 保留原ShellContent代码
此时你原来的ShellContent代码无需修改,Shell可以正常通过无参构造创建页面实例,页面会自动根据路由路径加载对应tab内容。
内容的提问来源于stack exchange,提问作者Giuliano Caruso
相关产品推荐
相关产品推荐

