Обновление 2018-09-10
Вы думаете, что реализовали INotifyPropertyChanged
, добавив INotifyPropertyChanged
к определению вашего класса и добавив событие
public event PropertyChangedEventHandler PropertyChanged;
вместе с вызовом события
public void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
Во всяком случае, поскольку ContentPage
уже реализует INotifyPropertyChanged
, добавление тех, которые не реализуют INotifyPropertyChanged
. ContentPage
уже определяет событие (точнее, BindableObject
, от которого ContentPage
косвенно наследуется). Любой объект, который полагается на получение информации об изменениях свойств на вашей странице, подпишется на событие PropertyChanged
предка, а не на определенное вами событие PropertyChanged
, поэтому ActivityIndicator
не будет обновляться.
Просто удалите событие, которое вы определили, и наберите OnPropertyChanged
вместо RaisePropertyChanged()
, и все будет в порядке.
private bool isLoading;
public bool IsLoading
{
get
{
return isLoading;
}
set
{
isLoading = value;
OnPropertyChanged();
}
}
Поскольку OnPropertyChanged
объявлено как
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
вам не нужно передавать имя свойства вручную. Компилятор сделает это за вас, так как CallerMemberNameAttribute
.
Конец обновления
Расширение XAML {Binding IsLoading}
связывает ActivityIndicator
с BindingContext
вашей страницы. По умолчанию BindingContext
равен null
, поэтому с ним нечего связывать, и все ваши усилия напрасны.
с моделью представления
Предпочтительным решением будет использование модели представления и присвоение ей MainPage.BindingContext
, например,
var page = new MainPage()
{
BindingContext = new MainPageViewModel()
}
но если вы идете по этому пути, вы должны переместить всю свою логику пользовательского интерфейса в эту модель представления и инкапсулировать ваш SQL-доступ и бизнес-логику в другие классы, чтобы сохранить модель представления в чистоте от доступа к ресурсам и бизнес-логики , Наличие доступа к ресурсам и логики в коде может сработать для этого небольшого примера, но, скорее всего, станет неразрешимым беспорядком.
без модели представления
В любом случае, у вас нет , чтобы использовать модель представления для использования привязок. Вы можете установить BindingContext
для страницы (или некоторых детей) или использовать Source
из BindingExtension
Настройка BindingContext
BindingContext
передается с любой страницы или представления его детям. Сначала вы должны дать своей странице имя с x:Name="Page"
(не обязательно использовать Page
, во всяком случае, вы не можете использовать имя класса своей страницы) и установить BindingContext
для этой страницы
<ContentPage ...
x:Name="Page"
BindingContext="{x:Reference Page}"
...>
теперь привязка к IsLoading
должна работать.
Использование Source
в Binding
Если вы хотите сослаться на что-то другое, чем BindingContext
представления, BindingExtension
имеет свойство Source
. Вы также должны дать название своей странице (см. Выше)
<ContentPage ...
x:Name="Page"
...>
и теперь вы можете ссылаться на это в вашей привязке
<ActivityIndicator
...
IsRunning="{Binding Path=IsLoading, Source={x:Reference Page}}"
IsVisible="{Binding Path=IsLoading, Source={x:Reference Page}}"/>