FantasyMVVM是一个针对MAUI而设计的MVVM模式框架。当前是预览版。可能会有未知的bug。正式项目中谨慎使用!!!
该框架仿照WPF的PRISM框架而编写,包含了视图注册,导航,Region注册等。当前适配的是MAUI的preview 的最新版本。
项目基于MAUI (最新)版本开发,您可能需要保证您的MAUI是.net8
您可以使用nuget进行下载
Install-Package FantasyMvvm
- 在MauiProgram.cs文件中添加
builder.UseFantasyApplication().UseGetProvider();
- 在App.xaml.cs文件中更换App基类
public partial class App : FantasyBootStarter
- 在App.xaml中修改如下
<local:FantasyBootStarter xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:local="clr-namespace:FantasyMvvm;assembly=FantasyMvvm"
- 使用扩展方式 UseRegisterPage 注册您的Page和PageView。如果是页面PageModel应该继承 FantasyPageModelBase 如果是ViewModel应该继承 FantasyViewModelBase
builder.UseRegisterPage<MainPage,MainPageModel>("MainPage");
builder.UseRegisterPage<SecondPage, SecondPageModel>("SecondPage");
builder.UseRegisterView<TitleView, TitleViewModel>("TitleView");
- 在您的App.xaml.cs文件中设置启动页面
protected override string CreateShell()
{
return "MainPage";
}
属性绑定采用微软的 CommunityToolkit.Mvvm 。因此您可以使用如下语法:
[ObservableObject]
private string title;
命令绑定采用微软的 CommunityToolkit.Mvvm
。因此您可以使用如下语法:
[ICommand]
public void Next()
{
//todo
}
FantasyMvvm的页面注册可以自动化绑定PageModel,当然,这需要您进行手动配置。您可以使用扩展方法public static MauiAppBuilder UseRegisterPage<P, PM>(this MauiAppBuilder builder,string name)
来进行注册。示例如下:
builder.UseRegisterPage<MainPage,MainPageModel>("MainPage");
builder.UseRegisterPage<SecondPage, SecondPageModel>("SecondPage");
UseRegisterPage 需要您传递一个string类型的变量,该变量的作用是让你给你的页面命名,未来导航的时候您可以根据命名来切换页面。
视图是应用于页面的小组件,一个页面中可能会有多个视图,注册一个视图非常简单,和页面注册一样,不过,您使用的是public static MauiAppBuilder UseRegisterView<V, VM>(this MauiAppBuilder builder, string name)
扩展方法。示例如下:
builder.UseRegisterView<TitleView, TitleViewModel>("TitleView");
UseRegisterView 需要您传递一个string类型的变量,该变量的作用是让你给你的视图命名,未来切换视图时候您可以根据命名来切换。
如果您期望您的页面在切换到其他页面后在切换回来的时候,数据不会被重新生成,您可以在你的PageModel中继承IPageKeep
接口,该接口非常简单,只有一个bool类型的变量 Keep,如果您设置Keep变量为true,则会保持页面。
导航功能用于切换页面,如要使用导航,您可以在PageModel或者ViewModel中注入 INavigationService
INavigationService 提供了导航的两个方法,分别是
Task NavigationToAsync(string pageName, bool hasBackButton = true, INavigationParameter parameter = null);
Task NavigationToAsync(string pageName, INavigationParameter parameter = null);
pageName:要跳转的页面名称
hasBackButton:默认是true,表示顶部会有一个返回上一个页面的按钮,通常情况下,建议都是true.但是当您使用登录页面的时候,登录成功后您不希望用户点击回退或者其他方式在返回登陆页面,您可以设置为false。注意,一旦您设置为false,会清空所有页面。
parameter:导航参数,您在跳转页面的时候可以传递参数给下一个页面。
除了Page页面,还有一种叫做View的视图,视图就像是一个页面的组件,可以在一个页面中放置多个视图。每个页面都需要一个类似占位符的东西来标注自己可以放置视图。
在您的页面文件中(xaml文件)添加命名空间
xmlns:fanasy="clr-namespace:FantasyMvvm.FantasyAttachProp;assembly=FantasyMvvm"
添加一个ContentView控件
<ContentView fanasy:FantasyRegion.Region="ImageRegion"/>
FantasyRegion.Region="ImageRegion" 告知应用生成一个叫做ImageRegioin的占位符。
在PageModel中注入 IRegionManager 接口,该接口只有一个方法:
void SetRegionView(string regionName,string viewName);
regionName:占位符名称,即上文中的ImageRegion
viewName:视图名称
如果PageModel需要接收上一个页面的参数,您需要让您的PageModel实现 INavigationAware
该接口需要您实现两个方法
public void OnNavigatedTo(string source, INavigationParameter parameter);
public void OnNavigatedFrom(string source,INavigationParameter parameter);
source: 上一个页面的名称
parameter: 通过parameter您可以获得上一个页面传递的参数。
这个项目 MIT 协议, 请点击 LICENSE 了解更多细节。