我实现了一个类来创建自定义控件(如标签栏)。 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);
};
但没有被开除。
答案 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
};