目前正在致力于将我们的移动应用程序从 xamarin 重构为 maui。在xamarin应用程序中,我们使用prism进行导航,但我们想停止使用prism。对于导航,我们遵循 Max Borrmanns 的方法,在移动到页面后触发 OnAppearing 函数:https://learn.microsoft.com/en-us/answers/questions/1186365/net-maui-viewmodel-alternative-to -出现时
在 Prism 中,它们有一个名为 OnNavigateTo 的函数,其功能类似,但也将 INavigationParameters 作为输入。所以在 prism 中,当导航到页面时,会调用以下内容:
public async void OnNavigatedTo(INavigationParameters parameters)
OnNavigedTo 被调用,我们不必显式定义任何参数,它们只是在调用时可用。作为替代,我正在考虑做这样的事情:
public async void OnAppearing(Dictionary<String, Object> parameters)
这种方法的问题在于必须手动定义参数,这意味着我们实际上并没有使用任何导航参数,因为我们不断创建新参数。有毛伊岛本地的方法可以做到这一点吗?
Shell 的
GoToAsync()
提供了传递 Dictionary<string, object>
的可能性:https://learn.microsoft.com/dotnet/maui/fundamentals/shell/navigation?view=net-maui-8.0#pass-data。然后,您的 ViewModel 需要实现 IQueryAttributable
。这将是使用 Shell 的“原生”MAUI 方式。
页码:
public class SomePage : ContentPage
{
private readonly SomeViewModel _vm;
public SomePage(SomeViewModel vm)
{
_vm = vm;
}
}
视图模型:
public class SomeViewModel : ObservableObject, IQueryAttributable
{
[ObservableProperty]
private SomeModel _myModel;
public void ApplyQueryAttributes(IDictionary<string, object> query)
{
MyModel = query["model"] as SomeModel;
}
}
注册页面:
Routing.RegisterRoute("SomePage", typeof(SomePage));
导航:
await Shell.Current.GoToAsync("SomePage", new Dictionary<string,object>
{
{ "model", new SomeModel() }
});