Caliburn.Micro:继承ViewModel时如何定位对应View
解决Caliburn.Micro多ViewModel关联单个View的问题
有两种无需修改Bootstrapper的方式,可直接在CustomViewModel中配置,实现“无同名View时复用基类View”的需求:
方法一:使用ViewAttribute特性
直接在CustomViewModel上标注特性,指定对应的基类View类型,Caliburn.Micro会直接使用该View进行绑定:
using Caliburn.Micro; using HMI.Base.Views; // 引入BaseView所在命名空间 [View(typeof(BaseView))] public class CustomViewModel : BaseViewModel { // 新增数据源参数及业务逻辑 public CustomViewModel(/* 你的数据源参数 */) : base(/* 基类构造参数 */) { // ... } }
方法二:自定义ViewLocator查找规则(仅对当前ViewModel生效)
如果需要保留“先找同名View,找不到再用基类View”的逻辑,可在CustomViewModel的静态构造函数中添加自定义查找规则:
using Caliburn.Micro; public class CustomViewModel : BaseViewModel { static CustomViewModel() { // 保存原有的查找逻辑 var originalLocator = ViewLocator.LocateForModelType; // 替换为自定义逻辑 ViewLocator.LocateForModelType = (modelType, displayLocation, context) => { // 先按默认规则查找同名View var view = originalLocator(modelType, displayLocation, context); // 如果找不到,且当前是CustomViewModel,则查找基类ViewModel对应的View if (view == null && modelType == typeof(CustomViewModel)) { view = originalLocator(typeof(BaseViewModel), displayLocation, context); } return view; }; } public CustomViewModel(/* 你的数据源参数 */) : base(/* 基类构造参数 */) { // ... } }
注意事项
- 方法一优先级更高,一旦标注
ViewAttribute,Caliburn会直接使用指定的View,不再执行默认的名称匹配逻辑。 - 方法二保留了默认查找逻辑,仅在找不到同名View时 fallback 到基类View,适合需要兼容后续可能新增
CustomView的场景。
内容的提问来源于stack exchange,提问作者user19335768
相关产品推荐
相关产品推荐

