Как перехватить событие NotifyPropertyChange - PullRequest
1 голос
/ 09 сентября 2010

Я только недавно обнаружил интерфейс INotifyPropertyChange.Мне удалось реализовать этот интерфейс в моем clss, и все работает отлично.Однако мне было интересно, можно ли перехватить это событие в коде и запустить функцию? Допустим, у меня есть функция

DoStuff()

, и я не хочу запускать эту функцию каждый раз, когда изменяются свойства1, свойства2 или свойства3,Конечно, я мог бы поместить эту функцию в блок набора в своем классе, но это не очень хорошая идея (я думаю).

Ответы [ 5 ]

2 голосов
/ 09 сентября 2010

Если вы имеете в виду внутренний метод, который будет обрабатывать это событие, вы можете сделать это, зарегистрировавшись на событие в конструкторе класса.Например:

public class AnswerViewModel : IAnswerViewModel
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string content;

    public AnswerViewModel()
    {
        PropertyChanged += (sender, args) => DoStuff();
    }

    public string Content
    {
        get { return content; }
        set
        {
            content = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Content"));
        }
    }

    public void DoStuff()
    {
        // this method will be called whenever PropertyChanged event raised
    }
}

Если метод перехвата принадлежит другому классу:

public class PropertiesInterceptor
{
    private readonly AnswerViewModel viewModel;

    private readonly List<string> propertiesToIntercept =
        new List<string> { "property1", "property2", "property3" };

    public PropertiesInterceptor(AnswerViewModel viewModel)
    {
        this.viewModel = viewModel;
        viewModel.PropertyChanged += OnPropertyChanged;
    }

    private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        if (propertiesToIntercept.Contains(args.PropertyName))
        {
            DoStuff();
        }
    }

    private void DoStuff()
    {
        // Do something with viewModel
    }
}
0 голосов
/ 09 сентября 2010

Похищение ответа Елисея для ответа на ваш вопрос в ответе Мерлина

public class AnswerViewModel : IAnswerViewModel
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string property1;
    private string property2;
    private string propertyX;

    public AnswerViewModel()
    {
        PropertyChanged += (sender, args) => 
        {
            if(args.PropertyName == "Property1" || args.PropertyName == "Property2")
                DoStuff();
        }
    }

    public string Property1
    {
        get { return content; }
        set
        {
            property1 = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Property1"));
        }
    }
    public string Property2
    {
        get { return content; }
        set
        {
            property2 = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Property2"));
        }
    }
    public string PropertyX
    {
        get { return content; }
        set
        {
            propertyX = value;
            PropertyChanged(this, new PropertyChangedEventArgs("PropertyX"));
        }
    }

    public void DoStuff()
    {
        // this method will be called whenever PropertyChanged event raised from Property1 or Property2
    }
}

Если класс DoStuff является членом, вы можете сделать

    private otherClass
    public AnswerViewModel()
    {
        PropertyChanged += (sender, args) => 
        {
            if(args.PropertyName == "Property1" || args.PropertyName == "Property2")
                otherClass.DoStuff();
        }
    }

В противном случае вы можете просто зарегистрировать otherClassсобытие в вашем основном коде.

0 голосов
/ 09 сентября 2010

Вы можете запустить метод из метода RaisePropertyChanged ():

public int Property1
{
    get { return this.property1; }
    set
    {
        if (this.property1 != value)
        {
            this.property1 = value;
            RaisePropertyChanged("Property1");
        }
    }
}

private void RaisePropertyChanged(string propertyName)
{
     if (PropertyChanged != null)
     {
         PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
     }

     DoStuff(); // Call DoStuff here.
}
0 голосов
/ 09 сентября 2010
0 голосов
/ 09 сентября 2010

Вам нужно было заменить существующие обработчики событий NotifyPropertyChanged или просто вызываться при вызове NotifyPropertyChanged?

Если вы имеете в виду второе, вы можете просто зарегистрировать обработчик события

редактировать

Вы можете добавить обработчик событий, который вызывается для NotifyPropertyChanged, проверяет, равен ли параметр свойства Property1, Property2 или Property3, и только затем перенаправляет его в фактическую функцию, которую вы хотите вызвать.

...