Поведение с BindableProperty не привязывается к vmproperty при первом запуске, но работает как ожидается при последующих запусках
У меня есть поведение с BindableProperty, который работает отлично, за исключением случаев, когда запись создается. При связывании свойства, как это
<Entry Text="{Binding MyEnteredValue}">
<Entry.Behaviors>
<behaviors:NumberValidator MaxNumber="{Binding VMMaxNumber}" />
</Entry.Behaviors>
</Entry>
я заметил, что начальная проверка в классе Поведения против значения по умолчанию MaxNumber. Последующие проверки (при редактировании текста в записи) работают как положено. (против фактического значения в VMMaxNumber)
Я проверил, что свойство de VMMaxNumber имеет значение, отображая его в метке. Кроме того, при использовании литерального значения, такого как BehMaxNumber="3", проблема не возникает.
Я хотел бы иметь возможность позволить поведению также проверить значение в записи при первом запуске с фактическим значением в VMMaxNumber.
Класс поведения как следующие:
public class NumberValidator: BehaviorBase<Entry>
{
public static readonly BindableProperty MaxNumberProperty =
BindableProperty.Create("MaxNumber", typeof(int), typeof(NumberValidator), defaultValue: 999);
static readonly BindablePropertyKey IsValidPropertyKey =
BindableProperty.CreateReadOnly("IsValid", typeof(bool), typeof(NumberValidator), false);
public static readonly BindableProperty IsValidProperty =
IsValidPropertyKey.BindableProperty;
public bool IsValid
{
private set { SetValue(IsValidPropertyKey, value); }
get { return (bool)GetValue(IsValidProperty); }
}
public int MaxNumber
{
get { return (int)GetValue(MaxNumberProperty); }
set
{
SetValue(MaxNumberProperty, value);
base.OnPropertyChanged();
}
}
protected override void OnAttachedTo(Entry entry)
{
entry.TextChanged += OnEntryTextChanged;
base.OnAttachedTo(entry);
}
protected override void OnDetachingFrom(Entry entry)
{
entry.TextChanged -= OnEntryTextChanged;
base.OnDetachingFrom(entry);
}
void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
IsValid = IsValidNumber(args.NewTextValue);
((Entry)sender).TextColor = IsValid ? Color.Green : Color.Red;
}
bool IsValidNumber(string strIn)
{
if (String.IsNullOrWhiteSpace(strIn))
{
return false;
}
decimal n;
var isNumeric = decimal.TryParse(strIn, out n);
if (isNumeric && MaxNumber >= n)
{
return true;
}
else
{
return false;
}
}
И BehaviorBase выглядит так:
public class BehaviorBase<T> : Behavior<T> where T : BindableObject
{
public T AssociatedObject { get; private set; }
protected override void OnAttachedTo(T bindable)
{
base.OnAttachedTo(bindable);
AssociatedObject = bindable;
if (bindable.BindingContext != null)
{
BindingContext = bindable.BindingContext;
}
bindable.BindingContextChanged += OnBindingContextChanged;
}
protected override void OnDetachingFrom(T bindable)
{
base.OnDetachingFrom(bindable);
bindable.BindingContextChanged -= OnBindingContextChanged;
AssociatedObject = null;
}
void OnBindingContextChanged(object sender, EventArgs e)
{
OnBindingContextChanged();
}
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
BindingContext = AssociatedObject.BindingContext;
}
}
Что мне здесь не хватает.... Заранее большое спасибо. Виктор