2016-10-19 10 views
0

私はMvvmCrossフレームワークでXamarin.iOSXamarin.AndroidUWPのクロスプラットフォームアプリケーションを作成しています。MvvmCross MvxWindowsPage <TViewModel>コンパイルエラー

LoginViewModelを持つLoginPageを作成しています。 Xamarin.iOSXamarin.Androidプロジェクトでは、ViewModelに以下とビューの結合は

public class LoginActivity : MvxAppCompatActivity<LoginViewModel> 
public partial class LoginViewController : MvxViewController<LoginViewModel> 

UWPプロジェクトで上記と同じようにやろうと、私はいくつかのエラーを取得するだけで正常に動作します。 XAMLで

<views:MvxWindowsPage 
x:TypeArguments="viewModels:LoginViewModel" x:Class="MyApp.UWP.Views.LoginView" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:views="using:MvvmCross.WindowsUWP.Views" 
xmlns:viewModels="using:MyApp.PresentationCore.ViewModels" 
mc:Ignorable="d"> 

そして、私のC#のコードは

public sealed partial class LoginView : MvxWindowsPage<LoginViewModel> 

あるしかし、私はコンパイルエラーを取得します。どうすれば解決できますか?

  • 要素に `不明なメンバー 'TypeArguments' 'MvxWindowsPage'
  • 名 "LoginViewModelは" "を使用して:MyApp.PresentationCore.ViewModelsの" 名前空間に存在しません。
  • 'MvvmCross.WindowsUWP.Views.MvxWindowsPage`1 [TViewModel]のGenericArguments [0]、' System.Object 'は' TViewModel 'タイプの 制約に違反します。

は、私が最初のエラーで何のテンプレートバージョンが存在しないため、エラーが少しあいまいであると思いますが、第三のエラーは、テンプレートの制約違反についてです。

ViewModelとViewを命名規則または属性でバインドするオプションがありますが、この厳密に型指定されたソリューションを使用したいと思います。

+0

あなたはこの問題を再現することができ、基本的なデモを共有していただけますか? –

+0

私はMvvmCrossソリューションのチームプレートから始まる基本的なデモを作成しました。あなたはそれにアクセスできます[ここ](https://github.com/cviktor/MvvmCrossExample)私が変更したのは、UWPプロジェクトのFirstViewの基本クラスだけです。 – cviktor

答えて

1

残念ながら、私はUWPがTypeArgumentsをサポートしておらず、続いてベースページのジェネリックタイプパラメータをサポートしていないと思います。あなたは彼らがそれについて議論するPrism GitHub threadをチェックアウトすることができます。だから、あなたは他の登録オプションの一つに行かなければならないでしょう。


Mvvmcrossは、あなたのViewViewModelに登録するための様々な代替的なアプローチを提供しています。あなたのページクラスに

あなたが追加することができMvxViewFor属性:

属性に基づく登録:Mvvmcrossの初期化時には、それはあなたの次の順序でMvxViewModelViewTypeFinderを使用して、ViewからViewModelを登録しようとします。

[MvxViewFor(typeof(FirstViewModel))] 
public sealed partial class FirstView : MvxWindowsPage 
{ 
    public FirstView() 
    { 
     this.InitializeComponent(); 
    } 
} 

コンクリートタイプに基づく登録は:

あなたはあなたのViewModelからViewのViewModelの具体的な種類を指定することで登録できます。

// Android 
public class FirstActivity : MvxAppCompatActivity<FirstViewModel> 

// iOS 
public class FirstViewController : MvxViewController<FirstViewModel> 

条約に基づく登録:

public sealed partial class FirstView : MvxWindowsPage { public new FirstViewModel ViewModel => base.ViewModel as FirstViewModel; public FirstView() { this.InitializeComponent(); } } 

または汎用ベース・クラスを使用することができますAndroidとiOSの場合は

あなたはあなたのビューを持っているとViewModelに従うことができます同じ命名規則とMvvmcrossがそれらをあなたのためにマップします(xxxViewとxxxViewModel)

ビュー

public sealed partial class FirstView : MvxWindowsPage 
{ 
    public FirstView() 
    { 
     this.InitializeComponent(); 
    } 
} 

のViewModel

public class FirstViewModel : MvxViewModel