MvvmCross:如何防止强制转换ViewModel?

MvvmCross:如何防止强制转换ViewModel?,mvvm,xamarin.ios,xamarin,mvvmcross,Mvvm,Xamarin.ios,Xamarin,Mvvmcross,我注意到在v3中,MvvmCross删除了MvxTouchViewController上的通用声明,并将其重命名为MvxViewController 这意味着ViewModel属性被类型化为IMvxViewModel的通用接口,而不是特定的TViewModel 如果需要访问视图控制器中的TViewModel,是否有一种方便的方法可以将ViewModel强制转换为该视图的特定实例类型?还是每次我都要自己投?之前基于泛型的MvvmCross视图被从MvvmCross中删除,主要是因为objectiv

我注意到在v3中,MvvmCross删除了MvxTouchViewController上的通用声明,并将其重命名为MvxViewController

这意味着ViewModel属性被类型化为IMvxViewModel的通用接口,而不是特定的TViewModel


如果需要访问视图控制器中的TViewModel,是否有一种方便的方法可以将ViewModel强制转换为该视图的特定实例类型?还是每次我都要自己投?

之前基于泛型的MvvmCross视图被从MvvmCross中删除,主要是因为objective-C平台中存在“Heizenbug”的威胁

对于很少有人知道的海森堡,请参见

我不相信我曾经见过Heizenbug,但Xamarin在他们的建议中非常明确,要不惜一切代价避免它们——例如,他们两次更改编译器,为我们的泛型发出错误。事实上,在.Mac上,这样的通用代码今天仍然是一个错误,而在.iOS上,这只是一个非常可怕的警告

除此之外,在从泛型基类继承时,基于Xaml的平台也遇到了一些问题——尽管这些问题主要得到了解决,例如:

除此之外-为了允许一些向后兼容性,WindowsPhone仍然有一些有限的通用视图支持,但这被标记为过时,我很遗憾允许它继续存在

好消息是,根据我的经验,大多数视图不需要知道它们的ViewModel类型——相反,大多数视图可以使用“纯绑定”构建,而无需声明类型化的ViewModel

对于那些确实需要知道其ViewModel类型的剩余视图,则一个简单的添加属性会快速添加此项-例如:

protected MyViewModel MyViewModel
{
    get { return (MyViewModel)base.ViewModel; }
    /* set is optional - not typically needed 
    set { base.ViewModel = value; } 
    */
}
或者,如果您愿意,也可以为此编写扩展方法,例如:

public static TViewModel TypedViewModel<TViewModel>(this IMvxView view) where TViewModel : class, IMvxViewModel
{
    return view.ViewModel as TViewModel;
}

这对你来说应该很好。。。但是如果你撞上了海森堡,我想没有人能帮你。Xamarin非常明确地反对这种模式,尤其是在基于objC的平台上。

之前基于通用的MvvmCross视图被从MvvmCross中删除,主要是因为基于objective-C的平台中存在“Heizenbug”的威胁

对于很少有人知道的海森堡,请参见

我不相信我曾经见过Heizenbug,但Xamarin在他们的建议中非常明确,要不惜一切代价避免它们——例如,他们两次更改编译器,为我们的泛型发出错误。事实上,在.Mac上,这样的通用代码今天仍然是一个错误,而在.iOS上,这只是一个非常可怕的警告

除此之外,在从泛型基类继承时,基于Xaml的平台也遇到了一些问题——尽管这些问题主要得到了解决,例如:

除此之外-为了允许一些向后兼容性,WindowsPhone仍然有一些有限的通用视图支持,但这被标记为过时,我很遗憾允许它继续存在

好消息是,根据我的经验,大多数视图不需要知道它们的ViewModel类型——相反,大多数视图可以使用“纯绑定”构建,而无需声明类型化的ViewModel

对于那些确实需要知道其ViewModel类型的剩余视图,则一个简单的添加属性会快速添加此项-例如:

protected MyViewModel MyViewModel
{
    get { return (MyViewModel)base.ViewModel; }
    /* set is optional - not typically needed 
    set { base.ViewModel = value; } 
    */
}
或者,如果您愿意,也可以为此编写扩展方法,例如:

public static TViewModel TypedViewModel<TViewModel>(this IMvxView view) where TViewModel : class, IMvxViewModel
{
    return view.ViewModel as TViewModel;
}

这对你来说应该很好。。。但是如果你撞上了海森堡,我想没有人能帮你。Xamarin非常明确地反对这种模式,特别是在基于objC的平台上。

从3.5开始,基于泛型的视图再次得到支持,因为Xamarin的基本问题显然已经得到了解决


从3.5开始,基于泛型的视图再次得到支持,因为基本的Xamarin问题显然已得到修复


我很感激我经常是第一个回答MvvmCross问题的人,但请为每个人提出问题,而不仅仅是“你”:请参阅中的“使其相关”。谢谢:我很感激我经常是第一个回答MvvmCross问题的人,但是请为每个人而不是仅仅为“你”提问题:请参阅中的“使其相关”。谢谢: