Привязка xamarin.forms от xaml к свойству

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

У меня это в моем xaml:

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

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

My.cs выглядит так:

....
    public bool IsLoading;

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

Ответ 1

Привязки обычно разрешаются из свойства 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 сможет читать свойства, указанные в привязках.

Изменить: Xamarin.Forms(и Silverlight/WPF и т.д.) извините, это было время!) также предоставляет метод SetBinding ( см. раздел Связывание данных).