Xamarin 是否更改了属性+;=LinkLabel_属性已更改;与受保护的override void OnPropertyChanged相同(字符串propertyName=null)

Xamarin 是否更改了属性+;=LinkLabel_属性已更改;与受保护的override void OnPropertyChanged相同(字符串propertyName=null),xamarin,xamarin.forms,Xamarin,Xamarin.forms,在像这样的Xamarin模板中。我认为有两种方法可以检查财产是否发生了变化 添加PropertyChanged+=LinkLabel\u PropertyChanged 覆盖,调用基 如果我想在多个属性发生更改时执行某些操作,那么这两种调用方法之间有什么区别吗 public class LinkLabel : Label { public LinkLabel() { PropertyChanged += LinkLabel_PropertyChanged;

在像这样的Xamarin模板中。我认为有两种方法可以检查财产是否发生了变化

  • 添加PropertyChanged+=LinkLabel\u 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
方法仅从标签的派生类内起作用

因此,如果要更改标签的行为,通常只会创建一个新的派生的
LinkLabel
类。在这里,您将重写OnPropertyChanged(如果需要)


如果您想了解主窗体中的更改,您可以直接在那里注册事件。无需创建派生类。

因此,在本例中,在我创建新类型标签的情况下,我说重写是一种可以接受的方法,对吗?请注意,我现在在问题中添加了我创建的代码,以使问题更加清楚。谢谢,我认为覆盖是正确的方法。我不是Xamarin的专家,但这在我看来是合理的。在这种情况下,显然比使用事件更直接。