2014-09-18 30 views
11

Ich bin ein Neuling mit Bindungen in Xaml und ich verstehe es wirklich manchmal nicht.Xamarin.forms Bindung von Xaml zu Eigenschaft

Ich habe dies in meiner XAML:

<ActivityIndicator IsRunning="{Binding IsLoading}" IsVisible="{Binding IsLoading}" /> 

Die Bindung "IsLoading". Wo deklariere/setze ich diese Eigenschaft ?!

sieht mein CS- wie folgt aus:

.... 
    public bool IsLoading; 

    public CardsListXaml() 
    { 
     InitializeComponent(); 
     IsLoading = true; 
.... 

Antwort

12

Bindungen typischerweise aus der BindingContext Eigenschaft aufgelöst werden (in anderen Implementierungen ist diese Eigenschaft DataContext genannt). Dies ist standardmäßig null (zumindest in anderen XAML-Implementierungen). Daher kann Ihre Ansicht die angegebenen Eigenschaften nicht finden.

In Ihrem Fall müssen Sie die BindingContext Eigenschaft auf this gesetzt:

public CardsListXaml() 
{ 
    InitializeComponent(); 
    BindingContext = this; 
    IsLoading = true; 
} 

Dies wird jedoch allein nicht ausreichen. Ihre aktuelle Lösung implementiert keinen Mechanismus zum Benachrichtigen der Ansicht von Eigenschaftsänderungen, so dass Ihre Ansicht INotifyPropertyChanged implementieren müsste. Stattdessen empfehle ich Ihnen das Model-View-ViewModel Muster implementieren, die nicht nur schön paßt mit Datenbindung, aber in einer mehr wartbar und überprüfbare Codebasis führen werden:

public class CardsListViewModel : INotifyPropertyChanged 
{ 
    private bool isLoading; 
    public bool IsLoading 
    { 
     get 
     { 
      return this.isLoading; 
     } 

     set 
     { 
      this.isLoading = value; 
      RaisePropertyChanged("IsLoading"); 
     } 
    } 

    public CardsListViewModel() 
    { 
     IsLoading = true; 
    } 

    //the view will register to this event when the DataContext is set 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

Und dann in Ihrem Code-Behind-Konstruktor:

public CardsListView() 
{ 
    InitializeComponent(); 
    BindingContext = new CardsListViewModel(); 
} 

Nur um zu klären, DataContext kaskadiert den visuellen Baum, damit das ActivityIndicator Steuerelement in der Lage sein wird, in den Bindungen angegebenen Eigenschaften zu lesen.

Edit: Xamarin.Forms (und Silverlight/WPF etc ... sorry, es ist schon eine Weile!) Auch eine SetBinding Methode liefert (siehe Datenbindung Abschnitt).

+1

'Xamarin.Forms'' BindableObject's haben keine 'DataContext' Eigenschaften, aber einen' BindingContext' –

+0

Danke für die Info! –

Verwandte Themen