2014-09-18 12 views
11

Sono un newbie totale con binding in xaml e davvero non capisco a volte.xamarin.forms vincolante da xaml alla proprietà

ho questo nel mio XAML:

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

Il "IsLoading" vincolante. Dove posso dichiarare/impostare questa proprietà ?!

miei cs aspetto:

.... 
    public bool IsLoading; 

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

risposta

12

Associazioni sono in genere risolti dalla proprietà BindingContext (in altre implementazioni, questa proprietà è chiamata DataContext). Questo è null per impostazione predefinita (almeno nelle altre implementazioni di XAML), pertanto la vista non è in grado di trovare le proprietà specificate.

Nel tuo caso, è necessario impostare la proprietà BindingContext a this:

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

Tuttavia, questo da solo non sarà sufficiente. La tua soluzione attuale non implementa un meccanismo per notificare la visualizzazione di eventuali modifiche alle proprietà, pertanto la tua visualizzazione dovrà implementare INotifyPropertyChanged. Invece, vi suggerisco di implementare il modello Model-View-ViewModel, che non solo si adatta perfettamente con l'associazione di dati, ma si tradurrà in una base di codice più gestibile e controllabile:

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

E poi nel costruttore vostra di code-behind:

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

Giusto per chiarire, DataContext scende a cascata lungo l'albero visivo, pertanto il controllo ActivityIndicator sarà in grado di leggere le proprietà specificate nei binding.

Modifica: Xamarin.Forms (e Silverlight/WPF ecc ... mi dispiace, è stato un po '!) Fornisce anche un metodo SetBinding (vedi Associazione dati sezione).

+1

'Xamarin.Forms'' BindableObject's non ha proprietà 'DataContext', ma un' BindingContext' –

+0

Grazie per le informazioni! –

Problemi correlati