2017-05-25 15 views
0

バインディングは、C#と比較してXamarinフォームで多少混乱しているようです。私はXam.Plugins.Settingsをインストールしました。私は単純に自分の設定の一つに<Entry>をバインドしたいと思っています。ここでは、私は私のXAMLで持っているものです。BindingContextを使用してXam.Plugins.Settingsにエントリをバインドする方法

<Grid BindingContext="{HelloWorld.Helpers.Settings}"> 
    ... 
    <Entry Placeholder="ESN" 
       Text="{Binding Path=Esn, Mode=TwoWay}" 
       ... 
    /> 
</Grid> 

そしてここでは、背後に私のコードです:

namespace HelloWorld.Helpers 
{ 
    public static class Settings 
    { 
     private static ISettings AppSettings 
     { 
      get 
      { 
       return CrossSettings.Current; 
      } 
     } 

     #region Setting Constants 

     private const string EsnKey = "esn_key"; 
     private static readonly string EsnDefault = string.Empty; 

     #endregion 

     public static string Esn 
     { 
      get 
      { 
       return AppSettings.GetValueOrDefault<string>(EsnKey, EsnDefault); 
      } 
      set 
      { 
       AppSettings.AddOrUpdateValue<string>(EsnKey, value); 
      } 
     } 
    } 
} 

しかし、私はエラーを取得しています:位置7:15に。タイプHelloWorld.Helpers.Settingsは

This tutorialが見つかりません動的にBindingContextを設定する方法の例を示しているが、あなたが見ることができるよう、設定クラスは静的であり、そして私はnewを呼び出すことはできません。私はまた、XAMLでバインディングを設定できるようにしたい。私はその後this tutorialを参照したので、XAMLのBindingContextの値を{x:Static HelloWorld.Helpers.Settings}に設定しようとしましたが、同じエラーが発生します。

私がしたいのは、HelloWorld.Helpers.Settings.Esn<Entry>にマップしてください。

アドバイスはありますか?私はXamarinにとって全く新しいので、C#の経験はほとんどありません。

ありがとうございます!

更新1 5/26 @Alessandroソリューションが動作します。ゲッターとセッターは既に設定で書かれているので、もう書き込む必要はありませんが、機能します。私はINPCを使う必要はありませんでした。他の誰かが同じ問題を抱えている場合の私のContentPageのコードは次のとおりです。ありがとう。

namespace HelloWorld 
{ 
    [XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class Configuration : ContentPage 
    { 
     public Configuration() 
     { 
      InitializeComponent(); 
      BindingContext = new MySettings(); 
     } 
    } 

    public class MySettings 
    { 
     public string Esn 
     { 
      get { return HelloWorld.Helpers.Settings.Esn; } 
      set { HelloWorld.Helpers.Settings.Esn = value; } 
     } 
    } 
} 

そして、コードビハインドで設定されているので、XAML内からBindingContextプロパティを削除しました。

アップデート2 5/26 私はちょうどpublic string Esnpublic class Settingspublic static string Esnpublic static class Settingsを変更しました。 MySettingsの必要性を防ぐことができます。代わりに私は書いていますBindingContext = new Settings();

私はなぜプラグインの開発者が代わりに静的を使用したのか分かりませんが、それは単純な解決策でした。

答えて

2

私はpublic static class Settingspublic static string Esn

  • からstaticキーワードを削除

    [ImplementPropertyChanged] 
    public class MySettings 
    { 
        public string Url { 
         get { return Settings.Url; } // These are yours "Settings" 
         set { Settings.Url = value; } 
        } 
        public int Port { 
         get { return Settings.Port; } 
         set { Settings.Port = value; } 
        } 
    
    } 
    
  • 0
    1. (私はINPCのためPropertyChanged.Fodyを使用)を使用すると、 "設定" を使用し、クラス "MySettings" を使用し、INotifyPropertyChangedのを実装すべきだと思いますContentPageのコンストラクタに、BindingContext = new Settings()
    2. を追加します。XAML
    3. BindingContextプロパティを削除します。

    これだけです。

    関連する問題