Если вы используете 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); }
}
}
обеспечивая строковый параметр является своего рода плохой стиль и не универсальным. Вы должны предоставить 'A' себя –
@StefanoL, вы частично правы, хотя в этом случае это неплохо. См. Http://msdn.microsoft.com/en-us/library/ms133020.aspx, также, это жестко заданное значение, проблема возникает при вводе пользователя – Jason