2017-06-15 6 views
1

Lets sagen, ich habe eine wirklich grundlegende Klasse mit ein paar Eigenschaften. ZB:Xaml Bindung an benutzerdefinierte Klasse in Xamarin Forms

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

Und ich möchte dazu in Xaml, wie würde ich das tun?

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

Und dann in meiner XAML: direkt auf das Objekt zu binden, so in meinem XAML-Seite Code hinter Ich habe versucht,

<?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" /> 

Und ich habe auch versucht Einstellung die Binding auf einer übergeordneten Steuerung:

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

Aber es funktioniert einfach nicht. Ich habe versucht Einstellung auch den Binding der Seite anInstance:

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

Und die Bindung nur, um seine Eigenschaften auf der XAML-Seite:

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

Aber auch hier alles, was ich bekommen sind leere Seiten. Es scheint, dass mindestens einer von diesen funktionieren sollte. Was ist die empfohlene Methode zum Binden an Eigenschaften in einer benutzerdefinierten Klasse?

bearbeiten

Anbordnahme @ Jason Kommentare, ich habe dies auch versucht:

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

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

Aber wieder eine leere Seite ..

Gleiches Ergebnis mit:

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

Und

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

Ihr erstes Beispiel funktioniert nicht, weil "anInstance" keine Eigenschaft ist. Ihr letztes Beispiel sollte funktionieren. – Jason

+0

Kein Code funktioniert. Ihr anInstance-Objekt muss eine Eigenschaft sein. Dies bedeutet, dass es wie folgt deklariert werden muss: public MyClass anInstance {get; einstellen; } '. –

+0

In beiden angehängten Beispielen setzen Sie den BindingContext sowohl in XAML als auch in Code. Wählen Sie oder das andere, nicht beides. Es ist bestenfalls verwirrend. Ich finde es im Allgemeinen klarer, es in den Code dahinter zu setzen. – Jason

Antwort

1

Sie sind fast da. Ihre Eigenschaft muss öffentlich sein (oder geschützt sein könnte funktionieren. Dann legen Sie den Bindungskontext auf this fest. Das ist in Ordnung.Für das Protokoll, ich bin mit diesem Code:

public MyClass AnInstance { get; set; } 

public MainPage() 
{ 
    InitializeComponent(); 

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

Jetzt in Ihrem XAML, können Sie es zugreifen Eigenschaften wie folgt aus:

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

Wenn Sie den Eigenschaftsnamen nicht AnInstance Präfix wollen, setzen Sie das Bindung Kontext dies direkt die Instanz des MyClass Objekt, wie:

public MyClass AnInstance { get; set; } 

public MainPage() 
{ 
    InitializeComponent(); 

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

Sie nun die Eigenschaften, die zu der MyClass dire verwenden können ctly, wie folgt: <Label Text="{Binding OrOther}" VerticalOptions="Center" HorizontalOptions="Center" />

+0

Danke. Sehr nützlich. Warum kann ich den Kontext im Codebehind nicht darauf setzen, dann setze den BindingContext in einem Stacklayout auf AnInstance. Verwenden Sie innerhalb dieses dann nur die Felder auf AnInstance, ohne den FQ-Namen zu benötigen? –

+0

Ist auch irgendwo dokumentiert, dass nur mit öffentlichen Feldern zu arbeiten ist? Warum muss es öffentlich sein, wenn beide Teil der gleichen Klasse sind? Nur neugierig, das ist alles ... –

Verwandte Themen