Пользовательское событие в пользовательском элементе управления (при изменении переменной)

Я делаю настраиваемый элемент управления, включающий три кнопки. Каждая кнопка представляет вкладку. Когда я нажимаю кнопку, чтобы перейти на вкладку, соответствующую этой вкладке, переменная для элемента управления обновляется, эта переменная называется «selectedIndex». Как я могу создать пользовательское событие, которое срабатывает при изменении этого индекса?

Я видел решения для пользовательских событий здесь, но все они являются копиями уже существующих событий, таких как Click-события. Моя проблема связана с событием при изменении переменной".

С Уважением!


person Dave    schedule 10.06.2014    source источник
comment
Является ли эта переменная свойством объекта? Объект может реализовать INotifyPropertyChanged как стандартный интерфейс и вызвать событие PropertyChanged в установщике свойства.   -  person David    schedule 10.06.2014
comment
Очень хорошая идея, я посмотрю, как сделать мою переменную свойством. Спасибо!   -  person Dave    schedule 10.06.2014
comment
Итак, я добавил свойство для IndexCHanged: public int SelectedIndex { get; private set; //set { selectedIndex = value; } } Теперь, как мне добавить INotifyPropertyChanged только для этого свойства, чтобы оно запускало событие при изменении значения?   -  person Dave    schedule 10.06.2014


Ответы (1)


Одним из вариантов является реализация вашего объекта очень стандартного интерфейса INotifyPropertyChanged. Не существует правила, согласно которому каждое свойство объекта должно вызывать событие PropertyChanged, поэтому просто вызовите его для одного рассматриваемого свойства. Что-то вроде этого:

public class MyObject : INotifyPropertyChanged
{
    private string _myProperty;
    public string MyProperty
    {
        get { return _myProperty; }
        set
        {
            _myProperty = value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

Если ваша версия .NET не поддерживает CallerMemberName, вы можете удалить это и указать имя свойства вручную:

NotifyPropertyChanged("MyProperty");

В этот момент любой вызывающий код может подписаться на общедоступное событие PropertyChanged для любого экземпляра этого объекта. Этот интерфейс особенно удобен, потому что он обычно используется во многих технологиях пользовательского интерфейса для обновления элементов пользовательского интерфейса, привязанных к данным. Все, что обеспечивает интерфейс, на самом деле — это стандартное имя для события. Если вы предпочитаете, вы можете отказаться от интерфейса и просто создать собственное публичное мероприятие. И просто вызывайте это событие в любое время, когда это логически необходимо вашему объекту. Структура представления события и его вызова будет одинаковой.

person David    schedule 10.06.2014
comment
Большое спасибо, мистер! Я хотел бы сделать ваш первый комментарий ответом, поскольку на самом деле это хороший и прямой ответ на мой вопрос. Но поскольку я не могу, так как это всего лишь комментарий, я отмечу ваш другой ответ как ответ! Чудесного дня! - person Dave; 10.06.2014