MvvmCross视图命名规范、详细规则获取渠道及异常问题咨询
嗨,我来帮你梳理下这个问题,毕竟我之前也碰到过类似MvvmCross命名规则的头疼事儿!
MvvmCross命名规范与常见崩溃问题解析
一、关于命名规范的详细参考
你说旧Wiki失效确实挺坑的,不过MvvmCross的核心命名约定其实内嵌在它的视图-ViewModel自动绑定逻辑里,我整理了最关键的几条:
- ViewModel命名:必须以
ViewModel结尾(比如HomeViewModel),你遇到的“不以‘view_’开头就崩溃”大概率是项目里的自定义配置搞的——MvvmCross默认规则从来没要求ViewModel以view_开头,它默认是找[视图名]ViewModel或者[ViewModel名]视图的配对。 - 视图(布局/页面)命名:对应ViewModel的话,要去掉
ViewModel后缀,加上平台对应的视图后缀:- Android端:比如
HomeActivity、HomeFragment,布局文件则用小写下划线分隔(比如activity_home.xml,对应驼峰命名的ViewModel) - iOS端:比如
HomeViewController
- Android端:比如
- 无对应ViewModel的布局:如果你的布局不需要绑定ViewModel,得避免让框架自动扫描到它作为“视图-ViewModel配对”的一部分,不然框架会尝试找对应的ViewModel,找不到就崩溃。
二、解决你遇到的两个崩溃问题
1. 添加无对应View/ViewModel的布局时崩溃
这是因为MvvmCross的Setup类默认会自动注册所有符合命名规则的视图和ViewModel配对。对于独立布局(比如通用弹窗、列表项布局),你可以这么做:
- 把这类布局放在非默认视图目录下(比如Android的
layout/common文件夹),避开框架的自动扫描; - 或者在
Setup类中重写InitializeViewLookup方法,手动指定需要绑定的视图-ViewModel配对,排除不需要的布局; - 另外,如果是在代码里手动加载布局(比如用
LayoutInflater.Inflate),别用MvvmCross的导航或绑定机制加载,用原生方式加载就不会触发ViewModel查找。
2. ViewModel名称不以‘view_’开头时崩溃
这绝对是你项目里的自定义规则,不是MvvmCross的默认行为。你可以检查这些地方:
- 看看
Setup类有没有重写GetViewModelType或GetViewType方法,之前的开发者可能加了自定义命名逻辑,强制要求ViewModel以view_开头; - 确认项目里有没有注册自定义的视图查找服务,也可能是那里加了限制;
- 检查你的MvvmCross版本,超旧版本(比如v5之前)的规则可能不一样,但现代稳定版都是严格遵循
[X]ViewModel/[X]View的命名模式的。
三、补充:如何确认当前项目的命名规则
如果你不确定项目里的自定义规则,可以去Setup类里找这几个方法:
InitializeViewLookup:这里会定义视图和ViewModel的映射关系;GetViewModelTypeFromViewType:从视图类型反推ViewModel类型的逻辑;GetViewTypeFromViewModelType:从ViewModel类型反推视图类型的逻辑。
给这些方法加个日志输出,就能明确框架当前的命名匹配规则了。
内容的提问来源于stack exchange,提问作者Tobias von Falkenhayn
相关产品推荐
相关产品推荐

