#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. Да, я думаю, что переопределение здесь является правильным подходом.