2017-06-15 7 views
1

私はいくつかのプロパティを持つ本当に基本的なクラスを持っていると言います。例:XamlはXamarinフォームのカスタムクラスにバインドします

public class MyClass 
    { 
     public MyClass() 
     { 
      Something = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"; 
      OrOther = "Proin dignissim, nunc non tincidunt imperdiet, magna urna malesuada enim"; 
     } 
     public string Something { get; set; } 
     public string OrOther { get; set; } 
    } 

これをXamlでデータバインドするにはどうすればよいですか。 私は後ろの私のXAMLページのコードでは、オブジェクトに直接結合しようとしました:私のXAMLで

public partial class MainPage : ContentPage 
    { 
     public MyClass anInstance; 
     public MainPage() 
     { 
      InitializeComponent(); 
      anInstance = new MyClass(); 
      BindingContext = this; 
     } 
    } 

そして:

<?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:DataBindingTest" 
      x:Class="DataBindingTest.MainPage"> 

    <Label Text="{Binding anInstance.Something}" 
      VerticalOptions="Center" 
      HorizontalOptions="Center" /> 

そして、私はまた、設定しようとしました親コントロール上のBindingContext:

<?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:DataBindingTest" 
      x:Class="DataBindingTest.MainPage"> 
    <StackLayout BindingContext="anInstance">   
     <Label Text="{Binding Something}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 
    </StackLayout> 

</ContentPage> 

ただし、それは機能しません。

public partial class MainPage : ContentPage 
    { 
     public MyClass anInstance; 
     public MainPage() 
     { 
      InitializeComponent(); 
      anInstance = new MyClass(); 
      BindingContext = anInstance; 
     } 
    } 

、ちょうどXAML側でそのプロパティへの結合::私はまたanInstanceにページのBindingContextを設定しようとしました

<?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:DataBindingTest" 
      x:Class="DataBindingTest.MainPage"> 

     <Label Text="{Binding Something}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 

</ContentPage> 

しかし、再び、私が得るすべては空白のページです。 少なくとも1つはうまくいくようです。 このようなカスタムクラスのプロパティにバインドするには、どのような方法が推奨されますか?

編集

コメント@jasonボードに取って、私はまた、これを試してみた:

public MyClass anInstance 
     { 
      get 
      { 
       return _anInstance; 
      } 
      set 
      { 
       _anInstance = value; 
      } 
     } 
     private MyClass _anInstance { get; set; } 
     public MainPage() 
     { 
      InitializeComponent(); 
      anInstance = new MyClass(); 
      BindingContext = this; 
     } 

と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:DataBindingTest" 
      x:Class="DataBindingTest.MainPage"> 
    <StackLayout BindingContext="anInstance"> 
     <Label Text="{Binding Something}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 
     <Label Text="{Binding OrOther}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 
    </StackLayout> 
</ContentPage> 

しかし、再び空白のページ..

同じ結果:

private MyClass anInstance { get; set; } 
     public MainPage() 
     { 
      InitializeComponent(); 
      anInstance = new MyClass(); 
      BindingContext = this; 
     } 

そして

<?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:DataBindingTest" 
      x:Class="DataBindingTest.MainPage"> 
    <StackLayout BindingContext="anInstance"> 
     <Label Text="{Binding Something}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 
     <Label Text="{Binding OrOther}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 
    </StackLayout> 
</ContentPage> 
+0

"anInstance"はプロパティではないため、最初の例は機能しません。あなたの最後の例がうまくいくはずです。 – Jason

+0

いずれのコードも表示されません。 anInstanceオブジェクトはプロパティでなければなりません。これは 'public MyClass anInstance {get;}のように宣言されなければならないことを意味します。セット; } '。両方の追加例で –

+0

を使用している場合は、XAMLとコードの両方にBindingContextを設定しています。どちらか一方だけを選択してください。それは最高に混乱しています。私は一般的に、コードの背後にそれを設定することを明確にしています。 – Jason

答えて

1

あなたはほとんどそこにいます。プロパティをパブリックにする必要があります(または保護されている可能性があります)。次に、バインディングコンテキストをthisに設定しています。記録のために、私はこのコードを使用しています:

public MyClass AnInstance { get; set; } 

public MainPage() 
{ 
    InitializeComponent(); 

    AnInstance = new MyClass(); 
    BindingContext = this; 
} 

を今すぐあなたのXAMLで、あなたはそれがこのような性質のアクセスすることができます:あなたは、プロパティ名AnInstance接頭辞をしたくない場合は

<?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:DataBindingTest" 
      x:Class="DataBindingTest.MainPage"> 
    <StackLayout> 
     <Label Text="{Binding AnInstance.Something}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 
     <Label Text="{Binding AnInstance.OrOther}" 
       VerticalOptions="Center" 
       HorizontalOptions="Center" /> 
    </StackLayout> 
</ContentPage> 

、設定MyClassオブジェクトのインスタンスに直接バインディングコンテキスト、次のように:

public MyClass AnInstance { get; set; } 

public MainPage() 
{ 
    InitializeComponent(); 

    AnInstance = new MyClass(); 
    BindingContext = AnInstance; 
} 

あなたは今悲惨なMyClassに属するプロパティを使用することができますctlyのように:<Label Text="{Binding OrOther}" VerticalOptions="Center" HorizontalOptions="Center" />

+0

ありがとう。本当に便利です。なぜか、私はコードビハインドでこれにコンテキストを設定することはできませんし、スタックレイアウトではBindingContextをAnInstanceに設定します。その中で、AnInstanceのフィールドをFQ名を必要とせずに使用するだけですか? –

+0

また、パブリックフィールドでの作業のみバインドについてはどこに文書化されていますか?同じクラスの部分的なものであれば、なぜパブリックにする必要がありますか?ちょうど興味深いthatsすべて... –

関連する問題