2010-09-09 13 views
0

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

DoStuff() 

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

+0

Просьба указать в вопросе, что есть другие свойства, которые вы хотите отфильтровать, которые вызывают событие NotifyPropertyChanged. –

ответ

1

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

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

. Вы можете изменить свое событие на PropertyChanged + = (sender, args) => if (args.PropertyName = = "property1" || args.PropertyName == "property2" || args.PropertyName == "property3") DoStuff(); ' –

+0

Хм, что, если я хочу, чтобы функция, которую я хочу вызвать, находится в другом классе? – Berial

+0

@Berial, добавил пример использования для перехвата из другого класса, чем тот, который поднимает 'PropertyChanged' – Elisha

0

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

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

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

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

+0

Мне нужно вызвать функцию, когда вызывается NotifyPropertyChanged, но только если были изменены Property1, Property2 или Property3 – Berial

0

Вы могли вести огонь метод от метода 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

Кража ответ Елисея, чтобы ответить на ваш вопрос в ответ Мерлина в

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 
    } 
} 

Если класс DoS туф в члене вы можете сделать

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

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

Смежные вопросы