Обработчик OnMyNameChanged
должен быть stati c, потому что MyNameProperty
слишком (ну, возможно, это технически возможно, но это было бы хрупко и прыгало через обручи). В любом случае, вы бы хотели, чтобы AssociatedObject
не был статическим c, потому что вам нужен один на каждый экземпляр CustNameBehavior
, все остальное, скорее всего, не будет работать должным образом.
Однако вы может обращаться к нестационарным c методам и свойствам из OnMyNameChanged
, поскольку экземпляр CustNameBehavior
передается через параметр bindable
. Кроме того, этот экземпляр содержит ссылку на Label
через AssociatedObject
. Следовательно, вы можете получить доступ к AssociatedObject
через target
(bindable
, который уже был приведен к CustNameBehavior
), следовательно, ваш метод станет
private static void OnMyNameChanged(BindableObject bindable, object oldValue, object newValue)
{
CustNameBehavior target = (CustNameBehavior)bindable;
if (target != null && target.AssociatedObject != null)
{
var value = (string)newValue;
if (string.IsNullOrWhiteSpace(value))
{
target.AssociatedObject.Text = "Empty!";
}
else
{
target.AssociatedObject.Text = value;
}
}
}
Обратите внимание, что Я добавил проверку для AssociatedObject
, являющегося null
, потому что я предполагаю, что OnMyNameChanged
вызывается до того, как поведение будет связано.
ИМХО, было бы еще лучше, если бы вы переместили экземпляр logi c в метод самостоятельно
private static void OnMyNameChanged(BindableObject bindable, object oldValue, object newValue)
{
CustNameBehavior target = (CustNameBehavior)bindable;
target?.SetLabelName((string)newValue);
}
private void SetLabelName(string name)
{
if(AssociatedObject != null)
{
AssociatedObject.Text = string.IsNullOrEmpty(name) ? "Empty!" : name;
}
}
Кроме того, вам нужно будет установить AssociatedObject.Text
из OnAttachedTo
, поскольку MyNameProperty
не будет установлен в настоящее время, что приведет к тому, что AssociatedObject.Text
не будет обновлено. Вы можете использовать SetLabelName
для этой цели, таким образом, вам не нужно будет дублировать логи c, которые проверяют наличие пустой строки.
protected override void OnAttachedTo(Label bindable)
{
base.OnAttachedTo(bindable);
AssociatedObject = bindable;
SetLabelName((string)GetValue(MyNameProperty));
bindable.BindingContextChanged += Bindable_BindingContextChanged;
}