2013-06-12 3 views
2

Я использовал INotifyPropertyChanged в пользовательском классе для запуска события, когда переменная изменилась, но мне было интересно, был ли простой способ запускать событие при изменении одной переменной как двойной.Событие пожара при изменении значения двоичного кода

Например, в приложении WPF, если у меня есть

private double a; 

в MainWindow.xaml.cs, есть простого способ активаций события в любое время a назначенное?

ответ

2

Если вы правильно поняли, вам нужно создать сеттер для a, который затем запускает событие event/custom eventy вместо того, чтобы инкапсулировать a в класс.

Что-то вроде этого:

private double a; 

    public double A 
    { 
     get { return a; } 
     set { a = value; 
       firepropertyChange(a); 
      } 
    } 
3

В поле отсутствуют какие-либо средства отслеживания изменений. Чтобы заставить его работать, это должно быть свойство, и что-то должно было бы обработать отслеживание. Это цель интерфейса INotifyPropertyChanged.

Нормальным средством отслеживания изменений этого значения было бы реализовать INotifyPropertyChanged в вашем классе.

0

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

private double a; 

public double PropertyA 
{ 
    get 
    { 
     return a; 
    } 
    set 
    { 
     // set value and fire event only when value is changed 
     // if we want to know when value set is the same then remove if condition 
     if (a != value) 
     { 
      a = value; 
      PropertyChanged("PropertyA"); 
     } 
    } 
} 

// when changing a, make sure to use the property instead... 
PropertyA = 5.2; 

... в противном случае, не

+0

обеспечивая строковый параметр является своего рода плохой стиль и не универсальным. Вы должны предоставить 'A' себя –

+0

@StefanoL, вы частично правы, хотя в этом случае это неплохо. См. Http://msdn.microsoft.com/en-us/library/ms133020.aspx, также, это жестко заданное значение, проблема возникает при вводе пользователя – Jason

0

Если вы используете C# 5.0, вы можете использовать CallerMemberName атрибут таким образом:

class MyData : INotifyPropertyChanged 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged(); 
     } 
    } 

    private string _anotherProperty; 
    public string AnotherProperty 
    { 
     get { return _anotherProperty; } 
     set 
     { 
      _anotherProperty = value; 
      RaisePropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged([CallerMemberName] string caller = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(caller)); 
     } 
    } 
} 

Как вы видите, вы просто должны позвонить RaisePropertyChanged(); в set для каждого свойства, без ввода имен свойств снова и снова.

Другой подход должен был бы определить ModelBase класс:

class ModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = "") 
    { 
     if (!Object.Equals(field, value)) 
     { 
      field = value; 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

А затем вывести свою модель из ModelBase:

class Conf : ModelBase 
{ 
    NodeType _nodeType = NodeType.Type1; 

    public NodeType NodeType 
    { 
     get { return _nodeType; } 
     set { Set(ref _nodeType, value); } 
    } 
} 
Смежные вопросы