Изменено свойство = LinkLabel_PropertyChanged; то же, что защищенное переопределение void OnPropertyChanged(string propertyName = null)

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

В шаблоне Xamarin, подобном этому. Я думаю, есть два способа проверить, изменилось ли свойство.

  • Добавление PropertyChanged = LinkLabel_PropertyChanged;
  • Переопределение, вызов базы

Если я хочу что-то сделать, когда изменилось более одного свойства, есть ли какая-либо разница между этими двумя способами вызова метода?

 public class LinkLabel : Label
{
    public LinkLabel()
    {
        PropertyChanged  = LinkLabel_PropertyChanged;
    }

    protected override void OnPropertyChanged(string propertyName = null)
    {
        base.OnPropertyChanged(propertyName);
        // Check property name and do action here
    }

    private void LinkLabel_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
       // Check property name and do action here
    }
}
  

Для справки вот то, что я закодировал, и мне интересно, хорошее ли это решение:

 public class LinkLabel : Label
{
    public LinkLabel()
    {
        SetDynamicResource(Label.FontFamilyProperty, "Default-Regular");
        SetDynamicResource(Label.FontSizeProperty,   "LabelTextFontSize");
        SetDynamicResource(Label.TextColorProperty,  "LinkLabelColor");
        VerticalOptions = LayoutOptions.CenterAndExpand;
        VerticalTextAlignment = TextAlignment.Center;
    }

    public static readonly BindableProperty IsImportantProperty =
        BindableProperty.Create(nameof(IsImportant), typeof(bool), typeof(LinkLabel), false);

    public bool IsImportant
    {
        get { return (bool)GetValue(IsImportantProperty); }
        set { SetValue(IsImportantProperty, value); }
    }

    protected override void OnPropertyChanged(string propertyName = null)
    {
        base.OnPropertyChanged(propertyName);
        if (propertyName == IsEnabledProperty.PropertyName ||
            propertyName == IsImportantProperty.PropertyName)
        {
            if (this.IsEnabled) {
                if (this.IsImportant)
                    this.SetDynamicResource(Label.TextColorProperty, "LinkLabelImportantColor");
                else
                    this.SetDynamicResource(Label.TextColorProperty, "LinkLabelColor");
            }
            else
                this.SetDynamicResource(Label.TextColorProperty, "LinkLabelDisabledColor");
        }
    }

}
  

Комментарии:

1. Я не эксперт по Xamarin, но для меня это выглядит разумно. Явно более прямолинейно, чем использование события в этом случае.

Ответ №1:

Да, разница в том, что регистрация для PropertyChanged события работает извне, переопределение защищенного (!) OnPropertyChanged метода работает только внутри производных классов Label .

Таким образом, обычно вы создаете новый производный LinkLabel класс только в том случае, если хотите изменить поведение метки. Там вы бы переопределили OnPropertyChanged (если вам нужно).

Если вы хотите получать информацию об изменении в вашей основной форме, вы должны зарегистрировать событие непосредственно там. Нет необходимости создавать производный класс.

Комментарии:

1. Итак, в этом случае, когда я создаю новый тип метки, правильно ли я говорю, что переопределение было бы приемлемым способом сделать это? Обратите внимание, что я добавил созданный мной код к вопросу сейчас, чтобы сделать вещи немного более понятными. Спасибо

2. Да, я думаю, что переопределение здесь является правильным подходом.