2016-08-04 17 views
0

Haftungsausschluss zu tun: Ich bin neu in Xamarin.Forms und XAML im AllgemeinenWie Databinding für Control in Xamarin.Forms

Ich versuche, herauszufinden, wie Databinding innerhalb von Vorlagen in Xamarin.Forms arbeitet.

XAML:

<ContentPage.Resources> 
    <ResourceDictionary> 
     <ControlTemplate x:Key="GridItem"> 
      <Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Padding="0" ColumnSpacing="0" RowSpacing="0"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="1*" /> 
        <RowDefinition Height="Auto" /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="1*" /> 
       </Grid.ColumnDefinitions> 

       <ContentView Grid.Row="0" Grid.Column="0" BackgroundColor="Red" VerticalOptions="FillAndExpand" Padding="15"> 
        <Image Source="{TemplateBinding ImageSource}" BackgroundColor="Red" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" /> 
       </ContentView> 
       <Label Grid.Row="1" Grid.Column="0" Text="{TemplateBinding LabelText}" FontSize="Large" TextColor="White" BackgroundColor="#8B0000" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" /> 
      </Grid> 
     </ControlTemplate> 
    </ResourceDictionary> 
</ContentPage.Resources> 

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*" /> 
     <RowDefinition Height="1*" /> 
     <RowDefinition Height="1*" /> 
    </Grid.RowDefinitions> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*" /> 
     <ColumnDefinition Width="1*" /> 
    </Grid.ColumnDefinitions> 

    <ContentView x:Name="randomButton1" ControlTemplate="{StaticResource GridItem}" Grid.Row="0" Grid.Column="0" /> 
    <ContentView x:Name="randomButton2" ControlTemplate="{StaticResource GridItem}" Grid.Row="0" Grid.Column="1" /> 
</Grid> 

C# -Code hinter mit Xamarin.Forms;

namespace TestApp.XForms 
{ 
    public partial class Page1 : ContentPage 
    { 
     private readonly MainButtonViewModel[] buttons; 

     public Page1() 
     { 
      InitializeComponent(); 

      randomButton1.BindingContext = new MainButtonViewModel("some text1", "someimage1.png"); 
      randomButton2.BindingContext = new MainButtonViewModel("some text2", "someimage2.png"); 
     } 
    } 

    public class MainButtonViewModel : BindableObject 
    { 
     private string labelText; 
     public string LabelText 
     { 
      get { return labelText; } 
      set 
      { 
       labelText = value; 
       OnPropertyChanged(); 
      } 
     } 

     private string imageSource; 
     public string ImageSource 
     { 
      get { return imageSource; } 
      set 
      { 
       imageSource = value; 
       OnPropertyChanged(); 
      } 
     } 

     public MainButtonViewModel() 
     { 
     } 
     public MainButtonViewModel(string text, string imageLocation) 
     { 
      LabelText = text; 
      ImageSource = imageLocation; 
     } 
    } 
} 

So scheinen meine Vorlagen zu funktionieren. Ich sehe 2 rote Blöcke. Aber keine der Bindungen scheint zu funktionieren. Alles ist leer: enter image description here

Wie bekomme ich die Datenbindung zu arbeiten?

Antwort

0

Ihr Ansichtsmodell unterstützt INotifyPropertyChanged nicht. Sie könnten Xamarin.Forms Klasse verwenden:

public class SomeViewModel : BindableObject 

Und dann könnte man UI mitteilen, dass eine Eigenschaft geändert wurde:

 private string _someStringProperty; 
     public string SomeStringProperty 
     { 
      get { return _someStringProperty; } 
      set 
      { 
       _someStringProperty = value; 
       OnPropertyChanged(); 
      } 
     } 

wird auch hilfreich sein Binding from ControlTemplate.

+0

Ich vermute, dies ist für 2-Wege-Bindung. Ich brauche nur 1-Weg-Bindung. Ich habe es gerade probiert, aber es scheint mein Problem nicht zu lösen. – MrSoundless

+0

'TwoWay' Bindung ist, wenn UI Ansichtsmodell sagt, dass etwas geändert wurde. Ich denke, wenn Sie einen Wert von der Eigenschaft zurückgeben, könnte es ohne Implementierung einer Schnittstelle funktionieren: public string LabelText {get {retutn "Alloha"}} ' –

+0

Ich habe meinen Post mit dem BindableObject aktualisiert. Es hat mein Problem nicht behoben. Ich habe auch versucht, eine Zeichenfolge im Getter des LabelText fest zu codieren. Das hat auch nicht für mich funktioniert. Das Etikett ist noch leer. Ich habe auch Binding anstelle von TemplateBinding versucht, da ich nicht weiß, welches korrekt ist. Das hat auch nicht funktioniert – MrSoundless

-1

Wenn Sie ControlTemplate verwenden es erfordert TemplateBinding für BindingContext, sonst wird es keine BindingContext selbst haben. Sie können DataTemplate ohne Einstellung BindingContext verwenden, es erbt Eltern BindingContext selbst.

heißt:

<ControlTemplate x:Key="yourTemplate" BindingContext="{TemplateBinding BindingContext}"> 
    <Grid> 
    <!--Your Template--> 
    </Grid> 
</ControlTemplate> 

<DataTemplate x:Key="yourTemplate"> 
    <Grid> 
    <!--Your Template--> 
    </Grid> 
</DataTemplate>