Xamarin - добавить OnPropertyChanged - PullRequest
0 голосов
/ 29 марта 2019

Я реализовал класс для создания пользовательского элемента управления (например, панели вкладок). Логическое значение 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 Ответ

1 голос
/ 29 марта 2019

То, что вам нужно, это старое доброе настраиваемое событие, точно как вы бы это делали в 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
};
...