Xamarin-添加一个OnPropertyChanged

时间:2019-03-29 09:49:20

标签: c# xamarin xamarin.forms inotifypropertychanged

我实现了一个类来创建自定义控件(如标签栏)。 IsSelected布尔值用于更改该控件的某些属性。

public bool IsSelected
{
    get => (bool)GetValue(IsSelectedProperty);
    set => SetValue(IsSelectedProperty, value);
}

public static readonly BindableProperty IsSelectedProperty =
    BindableProperty.Create("IsSelected", typeof(bool), typeof(CustomTabBar), false, BindingMode.TwoWay, propertyChanged: IsSelectedPropertyChanged);



public static void IsSelectedPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
    var control = (CustomTabBar)bindable;
    if (control != null)
    {
       control.IsSelected = (bool)newValue;
       control.Update();
    }
}

我需要在使用此控件的父视图中检测更改,以便相应地在IsSelected上显示内容。

我需要使用INotifyPropertyChanged吗?怎么样?

我在自定义控件类中使用INotifyPropertyChanged,并在父类中使用的地方放置一个侦听器:

PropertyChanged += (object sender, PropertyChangedEventArgs e) =>
{
    // logic goes here 

    Console.WriteLine("A property has changed: " + e.PropertyName);
};

但没有被开除。

1 个答案:

答案 0 :(得分:1)

您需要的是一个很好的旧自定义事件,正是您将在C#中执行的方式。

首先,您需要在自定义控件类中引入事件:

public delegate void IsSelectedHandler(object sender, EventArgs e);
public event IsSelectedHandler OnSelected;

然后,您最有可能希望通过属性更改的回调方法IsSelectedPropertyChanged引发事件:

public static void IsSelectedPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
    if (OnSelected != null) 
    {
        OnSelected(this, new EventArgs(/* Whatever you want to publish here*/));
    }
}

完成所有管道后,您现在可以在父视图中订阅这些事件,如下所示:

yourTabControl.OnSelected += delegate {
    // Logic goes here
};