2014-09-18 6 views
11

Я полный новичок со связями в xaml, и я действительно не понимаю его иногда.xamarin.forms привязка от xaml к свойству

У меня есть это в моем XAML:

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

связывании "IsLoading". Где я объявляю/устанавливаю это свойство ?!

Моего .cs выглядит следующим образом:

.... 
    public bool IsLoading; 

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

ответ

12

Наручники, как правило, решаются с BindingContext собственности (в других реализациях это свойство называется DataContext). Это по умолчанию null (по крайней мере, в других реализациях XAML), поэтому ваше представление не может найти указанные свойства.

В вашем случае, вы должны установить BindingContext свойство this:

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

Однако это само по себе не будет достаточно. Ваше текущее решение не реализует механизм уведомления о каких-либо изменениях свойств, поэтому ваше представление должно было бы реализовать INotifyPropertyChanged. Вместо этого я предлагаю вам реализовать Model-View-ViewModel шаблон, который не только соответствует красиво с привязкой данных, но приведут к более обслуживаемой и проверяемой базе кода:

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

, а затем в конструкторе вашего фонового кода в:

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

Чтобы уточнить, DataContext каскадирует вниз по визуальному дереву, поэтому элемент управления ActivityIndicator сможет читать свойства, указанные в привязках.

Edit: Xamarin.Forms (и Silverlight/WPF и т.д. ... извините, это было какое-то время!) Также обеспечивает SetBinding метод (см Data Binding раздел).

+1

'Xamarin.Forms'' BindableObject 'не имеют свойств DataContext', а' BindingContext' –

+0

Спасибо за информацию! –