在这样的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");
}
}
}
是的,不同之处在于注册PropertyChanged
事件可以从外部进行,重写受保护的(!(OnPropertyChanged
方法只能从Label的派生类中进行。
因此,如果您想更改标签的行为,通常只会创建一个新的派生LinkLabel
类。在那里,您可以覆盖OnPropertyChanged(如果需要的话(。
如果你想了解主表单的更改,你可以直接在那里注册活动。无需创建派生类。