2016-07-24 5 views
10

Xamarin.FormとMVVMを使用して簡単なプロジェクトを開発したいと考えています。 (XamarinPOCという名前の)私のソリューションでは、モデル(XamarinPOC.Model)とViewModel(XamarinPOC.ViewModel)用の別々のプロジェクトが別々のプロジェクト(標準のXamarin.Formsプロジェクトに加えて)を持っています。Xamarin.FormsのXAMLでBindingContextをViewModelに設定する

私はXamarinPOC.ViewModelプロジェクトにBaseViewModelクラスの抽象クラスを定義した(つまり、INotifyPropertyChangedのインタフェースを実装)、私は単純なプロパティでBaseViewModelクラスを拡張SummaryViewModelクラス作成した後:

namespace XamarinPOC.ViewModel 
{ 
    public class SummaryViewModel : BaseViewModel 
    { 

     private string _test = "The binding is OK!"; 
     public String test 
     { 
      get 
      { 
       return _test; 
      } 
      set 
      { 
       _test = value; 
       OnPropertyChanged("test"); 
      } 
     } 
     public SummaryViewModel(){} 
    } 
} 

次は、XamarinPOCプロジェクトに単純なContentPage(SummatyView)を作成しました。このプロジェクトには、ViewModelで定義されたテキストを表示するラベルだけが含まれています。私は、ビューとバインディングを定義するためにXAMLを使用したいが、私は何も表示されないアプリケーションを実行すると、コンパイル時と実行時にエラーはないが、テキストは表示されません。私のXAMLは、この

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:local="clr-namespace:XamarinPOC.ViewModel,assembly=XamarinPOC.ViewModel" 
      x:Class="XamarinPOC.Summary" 
      Title="Summary List" 
      BindingContext="XamarinPOC.ViewModel.SummaryViewModel"> 
    <StackLayout> 
    <Label Text="{Binding test}"/> 
    </StackLayout> 
</ContentPage> 

あり、最終的に私のapp.csです:XamarinPOCプロジェクトで

namespace XamarinPOC 
{ 
    public class App : Application 
    { 
     public App() 
     { 
      MainPage = new Summary(); 
     } 
    } 
} 

私はXamarinPOC.ViewModelとXamarinPOC.Modelアセンブリへの参照を追加しました。

私は問題がバインディングのXAML定義にあると思いますが、私はエラーが見つかりません。どこが間違っていますか?私が気づいたワンサイドノートが命名規則では、あなたの場合には、XAMLからのviewmodelにビューをバインドする

+2

だろうので、あなたはBindingContextをあなたのViewModelの*インスタンス*ではなく、クラス定義自体 – Jason

答えて

13

この

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:viewModels="clr-namespace:XamarinPOC.ViewModel; assembly=XamarinPOC.ViewModel" 
      x:Class="XamarinPOC.Summary" 
      Title="Summary List"> 
    <ContentPage.BindingContext> 
    <viewModels:SummaryViewModel/> 
    </ContentPage.BindingContext> 
    <StackLayout> 
    <Label Text="{Binding test}"/> 
    </StackLayout> 
</ContentPage> 

のようにそれを行う、それであっても、すべてあなたのviewmodelsを置く方が良いですあなたのケースでは、名前空間がXamarinPOC.ViewModel

+0

を割り当てる必要があり、「 ViewModelにS」という名前のフォルダ内の唯一のViewModelに、 ansのおかげでwer、私はあなたのソリューションを試しましたが、アプリケーションがネームスペースを解決しようとするとランタイム例外をスローしました 'xmlns:local =" clr-namespace:XamarinPOC.ViewModel;アセンブリ= XamarinPOC.ViewModel " しかし、あなたの解決策は、正しい実装のための情報を見つけたので、他の検索の後に正しい方向に進みます。 xmlns:mvvm =" clr-namespace:XamarinPOC.ViewModel; assembly = XamarinPOC.ViewModel "あなたのソリューションとの唯一の違いはxmlns接頭辞です。なぜなら、** xmlns:local **の使用はこの場合間違っており、別の接頭辞を使用する必要があるからです(私は** xmlns:mvvm **を選択します) – fabiuz

+0

!ただそれを修正した – BraveHeart

関連する問題