Wiązania są zazwyczaj rozwiązany od nieruchomości BindingContext
(w innych implementacjach, ta właściwość jest nazywany DataContext
). Domyślnie jest to null
(przynajmniej w innych implementacjach XAML), więc twój widok nie może znaleźć określonych właściwości.
W twoim przypadku, należy ustawić właściwość BindingContext
do this
:
public CardsListXaml()
{
InitializeComponent();
BindingContext = this;
IsLoading = true;
}
Jednak samo to nie wystarczy. Twoje obecne rozwiązanie nie implementuje mechanizmu powiadamiania o widokach zmian właściwości, więc Twój widok musiałby wdrożyć INotifyPropertyChanged
. Zamiast tego proponuję wdrożyć wzór Model-View-ViewModel, który nie tylko pasuje estetycznie z wiązania danych, ale spowoduje bardziej zarządzalny i sprawdzalne bazy kodu:
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));
}
}
}
, a następnie w konstruktorze kodzie opóźnieniem za:
public CardsListView()
{
InitializeComponent();
BindingContext = new CardsListViewModel();
}
Po to, aby wyjaśnić, DataContext
spływa kaskadowo wzdłuż drzewa wizualnego, dzięki czemu kontrolka ActivityIndicator
będzie mogła odczytać właściwości określone w powiązaniach.
EDIT: Xamarin.Forms (i Silverlight/WPF etc ... przepraszam, to było jakiś czas!) Zapewnia również SetBinding metody (patrz Wiązanie danych rozdział).
'Xamarin.Forms'' BindableObject's nie ma właściwości 'DataContext', ale' BindingContext' –
Dzięki za informację! –