bja*_*vor 5 c# lambda inotifypropertychanged
关于如何使用lambda表达式来引发INotifyPropertyChanged事件以重构自由代码,有大量代码和示例.这通常用作:
NotifyOfPropertyChanged(() => PropertyName);
Run Code Online (Sandbox Code Playgroud)
我的问题是,你如何在事物的接收端实现类似的东西,在那里你通常会有一些类型的switch语句:
private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
switch (args.PropertyName)
{
case "XYZ":
break;
//...
}
}
Run Code Online (Sandbox Code Playgroud)
现在以某种方式避免在这里使用字符串会很好,以便在更改属性名称时不会破坏...
作为目前的中途解决方案,我只使用具有公共常量的嵌入式类,例如:
public class MyClass
{
public static class Notifications
{
public const string Property1 = "Property1"
//...
}
//...
}
Run Code Online (Sandbox Code Playgroud)
然后在接收端:
private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
switch (args.PropertyName)
{
case MyClass.Notifictions.Property1:
break;
//...
}
}
Run Code Online (Sandbox Code Playgroud)
这比纯字符串要好一些,因为它们只需要在一个地方维护,并且在同一个类中,你也可以对属性名称进行任何更改,但仍然不是一个非常令人满意的解决方案......
有人知道更好的方法吗?
这取决于您对房产的实际需求。假设您想要更改后的属性的值,您可以使用以下方法reflection来获取它:
private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
object value =
sender.GetType().GetProperty(args.PropertyName).GetValue(sender, null);
}
Run Code Online (Sandbox Code Playgroud)
如果您的需求没有得到满足,reflection您仍然可以使用字符串比较,而不必担心属性名称会发生变化,方法与您在方法中使用的机制相同NotifyPropertyChanged。如果你不使用,你可以使用我的(代码在这里):
private void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == ExtendedObject.GetPropertyName(_ => _.Property1)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |