Поведение с 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;
    }
}

Что мне здесь не хватает.... Заранее большое спасибо. Виктор

0 ответов

Другие вопросы по тегам