作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 wpf 中,我们经常对可绑定(bind)属性使用以下模式:
private Foo _bar = new Foo();
public Foo Bar
{
get { return _bar; }
set
{
_bar = value;
OnPropertyChanged();
}
}
public void OnPropertyChanged([CallerMemberName] string property = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
CallerMemberNameAttribute
施展魔法,根据 setter 名称为我们生成 "Bar"
参数。
但是,通常存在没有 setter 或依赖属性的属性:
private Foo _bar;
public Foo Bar
{
get { return _bar; }
set
{
_bar = value;
OnPropertyChanged();
}
}
public bool IsBarNull
{
get { return _bar == null; }
}
在给定的示例中,当 Bar
发生更改时,IsBarNull
也需要事件。我们可以将 OnPropertyChanged("IsBarNull");
添加到 Bar
setter 中,但是...使用 string
属性是:
string
中的属性名称);WPF存在了这么久。是否还没有神奇解决方案(类似于CallerMemberNameAttribute
)?
最佳答案
使用 C# 6 和 nameof
特点:
OnPropertyChange(nameof(IsBarNull));
生成的等效代码为:
OnPropertyChange("IsBarNull");
...但没有脆弱性。
如果您坚持使用早期版本的 C#,您可以为此使用表达式树,但我认为这有点 hack 和潜在的性能问题(因为树是重新创建的在每次通话中)。 nameof
不需要任何库支持,只需要一个新的编译器 - 所以如果你升级到 VS 2015(或更高版本,亲爱的 future 读者......)你应该没问题。
关于c# - 如何在不将属性名称作为字符串传递的情况下引发 PropertyChanged 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31472254/
我是一名优秀的程序员,十分优秀!