web-dev-qa-db-ja.com

Xamarin.FormsのXAMLでBindingContextをViewModelに設定します

Xamarin.FormとMVVMを使用して簡単なプロジェクトを開発したい。私のソリューション(XamarinPOCという名前)には、(標準のXamarin.Formsプロジェクトに加えて)モデル用の個別のプロジェクト(XamarinPOC.Model)とViewModelの個別のプロジェクト(XamarinPOC.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プロジェクトで、ViewModelで定義されたテキストを表示するラベルのみを含む単純なContentPage(SummatyView)を作成しました。ビューとバインディングの定義に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は次のとおりです。

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

XamarinPOCプロジェクトでは、XamarinPOC.ViewModelおよびXamarinPOC.Modelアセンブリへの参照を追加しました。

問題はバインディングのXAML定義にあると思いますが、エラーは見つかりません。私はどこが間違っていますか?

18
fabiuz

あなたのケースでビューをXamlからビューモデルにバインドするには、次のようにします

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

私が気づいた1つの注意点は、命名規則に関するものです.1つのviewModelだけであっても、すべてのViewModelを「ViewModel s」という名前のフォルダ内に配置することをお勧めしますXamarinPOC.ViewModel -s

34
Ahmad ElMadi