Нет причин, по которым вы вынуждены использовать строки, это просто базовый механизм событий NotifyPropertyChanged
. Например, Prism Framework предоставляет простую оболочку, которая принимает в качестве аргумента Linq `Выражение> и использует отражение, чтобы получить имя свойства (но будьте осторожны; в одном случае я видел, что это вызывает проблему производительности при использовании свойства, которое много раз обновлялось за короткий промежуток времени).
Вы можете легко написать такую обертку, как эта, без необходимости использования всей среды Prism, например:
class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
protected virtual void OnPropertyChanged( ProeprtyChangedEventArgs e )
{
PropertyChanged( this, e );
}
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression )
{
// you'll want to add some error checking here
var name = ((MemberExpression)propertyExpression).Member.Name;
OnPropertyChanged( new PropertyChangedEventArgs( name ) );
}
}
Теперь вы можете использовать его, просто передав свойство:
class Whatever : NotificationObject
{
private string _foo = String.Empty;
public string Foo
{
get { return _foo ?? String.Empty; }
set
{
if( !_foo.Equals( value ) )
{
_foo = value;
RaisePropertyChanged( this.Foo );
}
}
}
}
Теперь, если вы когда-нибудь проведете рефакторинг свойства Foo
, вам не придется беспокоиться об обновлении строки. Это не решает проблему с другой стороны, хотя. DependencyProperty будет, но у вас есть внутренняя проблема с строкой, причем IMP предпочтительнее, потому что это только дублирование в одном месте (в классе), а не n количество дубликатов извне. Это не идеально, но это помогает.