Is PropertyChanged+=LinkLabel_PropertyChanged;与受保护的覆盖void On



在这样的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(如果需要的话(。

如果你想了解主表单的更改,你可以直接在那里注册活动。无需创建派生类。

相关内容

  • 没有找到相关文章

最新更新