Следить за изменениями в собственности - PullRequest
12 голосов
/ 29 февраля 2012

У меня есть 2 свойства для класса (управление WPF): HorizontalOffset и VerticalOffset (оба общедоступных Double).Я хотел бы вызывать метод всякий раз, когда эти свойства меняются.Как я могу это сделать?Я знаю об одном способе - но я почти уверен, что это неправильный способ (использование DispatcherTimer очень коротких интервалов между тиками для мониторинга свойства).

РЕДАКТИРОВАТЬ ДЛЯ БОЛЬШЕ КОНТЕКСТА:

Эти свойства принадлежат элементу управления расписанием Telerik.

Ответы [ 2 ]

24 голосов
/ 29 февраля 2012

Использование реализации интерфейса управления INotifyPropertyChanged.

Если элемент управления называется myScheduleView:

//subscribe to the event (usually added via the designer, in fairness)
myScheduleView.PropertyChanged += new PropertyChangedEventHandler(
  myScheduleView_PropertyChanged);

private void myScheduleView_PropertyChanged(Object sender,
  PropertyChangedEventArgs e)
{
  if(e.PropertyName == "HorizontalOffset" ||
     e.PropertyName == "VerticalOffset")
  {
    //TODO: something
  }
}
6 голосов
/ 29 февраля 2012

Я знаю один способ ... DispatcherTimer

Ух ты, избегай этого :) INotifyPropertyChange интерфейс - твой друг.См. MSDN для образцов.

Вы в основном запускаете событие (обычно называемое onPropertyChanged) на Setter ваших свойств, и подписчики обрабатывают его.

пример реализации из msdn:

// This is a simple customer class that 
// implements the IPropertyChange interface.
public class DemoCustomer  : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;    
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
          PropertyChanged(this, new PropertyChangedEventArgs(info));            
    }

    public string CustomerName
    {
        //getter
        set
        {
            if (value != this.customerNameValue)
            {
                this.customerNameValue = value;
                NotifyPropertyChanged("CustomerName");
            }
        }
    }
}
...