gpt4 book ai didi

MvvmCross:如何防止转换 ViewModel?

转载 作者:行者123 更新时间:2023-12-03 10:21:37 24 4
gpt4 key购买 nike

我注意到在 v3 中,MvvmCross 删除了泛型声明 <TViewModel>MvxTouchViewController并将其重命名为 MvxViewController .

这意味着 ViewModel属性被键入为 IMvxViewModel 的通用接口(interface)而不是具体的TViewModel .

如果我需要访问 TViewModel在我的 View Controller 中,是否有一种方便的方法可以将 ViewModel 转换为该 View 的特定实例类型?还是我每次都必须自己投?

最佳答案

以前基于通用的 MvvmCross View 已从 MvvmCross 中删除,主要是因为基于 objective-c 的平台中的“Heizenbugs”威胁。

鲜为人知的 Heizenbugs ,见 http://forums.xamarin.com/discussion/771/exporting-generic-type-to-objc-supported

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

除此之外,我们在从通用基类继承时也确实遇到了基于 Xaml 的平台的一些问题——尽管这些问题主要得到了解决(例如 XamlParseException when I inherit a Page from a Generic base class)

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

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

对于那些确实需要知道其 ViewModel 类型的剩余 View ,然后一个简单的添加属性可以快速添加 - 例如:

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;
}

非常另类....

.... 如果你不怕鬼、妖精或 Heizenbugs ……

添加 TypedViewModel 的一种方法您所有 View 的属性是将泛型添加回您的 View 层次结构 - 这对您来说很容易 - 例如在Android中添加
public class BaseActivity<TViewModel> : MvxActivity 
where TViewModel : class, IMvxViewModel
{
protected TViewModel TypedViewModel
{
get { return (TViewModel)base.ViewModel; }
/* set is optional - not typically needed
set { base.ViewModel = value; }
*/
}
}

这对你来说应该很好......但是如果你碰到了一个 Heizenbug,那么我认为没有人能够帮助你。 Xamarin 非常明确地反对这种模式——尤其是在基于 objC 的平台上。

关于MvvmCross:如何防止转换 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com