Когда я печатал это, я понял, что проблема заключалась в этой строке:
view.ShouldAnimate = value;
Решение: (Пожалуйста, поправьте меня, если я ошибаюсь)
BindableProperties хранятся в словаре, ключ указывает на его значение. При первом вызове моего делегата propertyChanged я разбил связанное значение и заменил его значением «value». С этого момента мой делегат ожидал получения уведомления от значения вместо свойства, которое я намеревался связать.
Я пытаюсь сделать простую анимацию, в то время как некоторые bool верны, однако, я, очевидно, неправильно понимаю, как на самом деле работают привязываемые свойства в Xamarin. Вот код:
public static readonly BindableProperty ShouldAnimateProperty = BindableProperty.Create(
"ShouldAnimate", typeof(bool),
typeof(UtilLayout), defaultValue: false,
propertyChanged: ShouldAnimateChanged);
public bool ShouldAnimate
{
get => (bool)GetValue(ShouldAnimateProperty);
set => SetValue(ShouldAnimateProperty, value);
}
private static void ShouldAnimateChanged(BindableObject bindable, object oldValue, object newValue)
{
var view = (UtilLayout)bindable;
var value = (bool)newValue;
view.ShouldAnimate = value;
if (value)
{
view.AnimationComplete += view.OnAnimationComplete;
view.AnimateIcon();
}
else
{
view.AnimationComplete -= view.OnAnimationComplete;
}
}
И XAML:
<controls:UtilLayout x:Name="ulSync"
LabelText="Sync"
ImageFilePath="ic_sync_orange_48dp.png"
Tapped="SyncButtonClicked"
ShouldAnimate="{Binding SyncInProgress}"/>
Приложение открывается на моей главной странице. Затем MainPage открывает модальную страницу входа. «SyncInProgress» является свойством модели представления MainPage. «ShouldAnimateChanged» только когда-либо называется ОДИН РАЗ и имеет значение true. Первоначально этот логический SyncInProgress является ложным в моей модели представления. Таким образом, это происходит, как и ожидалось. Вот и все, к сожалению. Делегат propertyChanged больше не вызывается.