Caliburn Micro中继承VariableViewModel后无法匹配对应View如何解决
问题原因
Caliburn Micro默认采用命名约定匹配实现ViewModel到View的自动绑定:当VM类型名称为[名字]ViewModel时,框架会自动查找同命名空间下名为[名字]View的视图进行关联。
你将属性类型替换为TemperatureVariableViewModel后,框架默认会查找名为TemperatureVariableView的视图,而非原来的VariableView,找不到对应视图就会出现显示异常。
解决方案
方案1:给派生VM添加View特性指定关联视图(最简单,适合少量派生类场景)
直接在TemperatureVariableViewModel类上标注Caliburn.Micro的View特性,显式指定关联的视图类型即可:
using Caliburn.Micro; [View(typeof(VariableView))] public class TemperatureVariableViewModel : VariableViewModel { public TemperatureVariableViewModel() : base("Temperature", "°C", "40.5") { } }
框架碰到带该特性的VM时,会优先绑定特性指定的视图,不再走默认命名匹配。
方案2:自定义ViewLocator规则(适合有大量同基类派生VM复用同一个View的场景)
在你的项目Bootstrapper的Configure方法中,重写ViewLocator的定位逻辑,让所有继承自VariableViewModel的子类都统一使用VariableView:
protected override void Configure() { // 原有配置逻辑保留 // 新增自定义View定位规则 ViewLocator.LocateForModelType = (modelType, displayLocation, context) => { // 如果当前VM是VariableViewModel的子类 if(typeof(VariableViewModel).IsAssignableFrom(modelType)) { // 返回VariableView的类型 return typeof(VariableView); } // 其他类型走默认逻辑 return ViewLocator.DefaultLocateForModelType(modelType, displayLocation, context); }; }
方案3:XAML中显式指定视图
如果不想改VM或者框架配置,也可以在MainView的XAML中,绑定该属性的ContentControl处,显式指定要使用的视图:
<ContentControl cal:View.Model="{Binding TemperatureViewModel}"> <cal:View.Context> <local:VariableView /> </cal:View.Context> </ContentControl>
内容的提问来源于stack exchange,提问作者RBCSharp
相关产品推荐
相关产品推荐

