2013-05-28 53 views
1

我注意到在v3中,MvvmCross刪除了MvxTouchViewController上的通用聲明<TViewModel>,並將其重命名爲MvxViewControllerMvvmCross:如何防止投射ViewModel?

這意味着ViewModel屬性被鍵入爲IMvxViewModel的通用接口,而不是特定的TViewModel

如果我需要在我的視圖控制器中訪問TViewModel,有沒有一種方便的方法讓ViewModel已經轉換爲該視圖的特定實例類型?或者我每次都必須自己投擲?

+0

我很欣賞我往往先回答MvvmCross問題,但請短語的問題給大家不只是爲「你」了:)參閱「使有關」在http://stackoverflow.com /問題/如何對問。謝謝:) – Stuart

回答

4

之前基於通用的MvvmCross Views已從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的系統仍然有一些有限的通用視圖的支持,但這種被標記爲Obsolete,我很遺憾讓這住上...)


的好消息是,在我的經驗,主要視圖的不需要知道它們的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; 
} 

很或者....

....如果你不害怕鬼,小妖精或Heizenbugs ....

一種方式來添加的您所有視圖的TypedViewModel屬性將會將泛型添加回您的視圖層次結構中 - 這對您來說很容易實現 - 例如在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的平臺上。

+0

真棒答案! – user2395286