- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
9年前关闭。
Possible Duplicate:
typesafe NotifyPropertyChanged using linq expressions
NotifyPropertyChanged("PropertyName")
形式的魔术字符串。 , - 咨询 Microsoft 时的标准实现。我们还遇到了大量错误命名的属性(使用具有数百个存储计算属性的计算模块的对象模型)——所有这些都绑定(bind)到 UI。
set { ... OnPropertyChanged("PropertyName"); }
set { ... OnPropertyChanged(() => PropertyName); }
protected virtual void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression)
{
MemberExpression body = selectorExpression.Body as MemberExpression;
if (body == null) throw new ArgumentException("The body must be a member expression");
OnPropertyChanged(body.Member.Name);
}
最佳答案
我对 NotifyPropertyChanged 进行了彻底的测试,以确定切换到 lambda 表达式的影响。
这是我的测试结果:
正如你所看到的,使用 lambda 表达式比普通的硬编码字符串属性更改实现慢大约 5 倍,但用户不应该担心,因为即使这样,它也能够在我的服务器上每秒输出十万个属性更改。这么特别的工作电脑。因此,不再需要对字符串进行硬编码并且能够拥有处理所有业务的单行 setter 所获得的好处远远超过了我的性能成本。
测试 1 使用标准的 setter 实现,并检查属性是否实际发生了变化:
public UInt64 TestValue1
{
get { return testValue1; }
set
{
if (value != testValue1)
{
testValue1 = value;
InvokePropertyChanged("TestValue1");
}
}
}
public UInt64 TestValue2
{
get { return testValue2; }
set
{
if (value != testValue2)
{
UInt64 temp = testValue2;
testValue2 = value;
InvokePropertyChanged("TestValue2", temp, testValue2);
}
}
}
public UInt64 TestValue3
{
get { return testValue3; }
set { SetNotifyingProperty(() => TestValue3, ref testValue3, value); }
}
protected void SetNotifyingProperty<T>(Expression<Func<T>> expression, ref T field, T value)
{
if (field == null || !field.Equals(value))
{
T oldValue = field;
field = value;
OnPropertyChanged(this, new PropertyChangedExtendedEventArgs<T>(GetPropertyName(expression), oldValue, value));
}
}
protected string GetPropertyName<T>(Expression<Func<T>> expression)
{
MemberExpression memberExpression = (MemberExpression)expression.Body;
return memberExpression.Member.Name;
}
public virtual void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(sender, e);
}
public class PropertyChangedExtendedEventArgs<T> : PropertyChangedEventArgs
{
public virtual T OldValue { get; private set; }
public virtual T NewValue { get; private set; }
public PropertyChangedExtendedEventArgs(string propertyName, T oldValue, T newValue)
: base(propertyName)
{
OldValue = oldValue;
NewValue = newValue;
}
}
关于wpf - 在没有魔术字符串的情况下实现 NotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7728465/
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: typesafe NotifyPropertyChanged using linq expressions 我正在开
我刚刚根据 Rachel Lim 的 blog 实现了我的业务逻辑验证。 . 一切都运行良好,直到我决定在绑定(bind)到 的 View 中放置一个触发器。有效像这样的属性(property):
测试此属性的最佳方法是什么: public string ThreadId { get { return _threadId; } set {
我有以下 View 模型 [NotifyPropertyChanged] public class ActivateViewModel { public string Password { g
我正在尝试为 ListBox 捕获 SelectedItem,然后为 Button 触发数据模板单击事件。我在 notifypropertychanged 事件处理程序中放置了一个断点,但它从未触发。
我正在查看 INotifyPropertyChanged 中的 NotifyPropertyChanged() 并注意到在 Microsoft 的示例中,例如此处: http://msdn.micro
如果我更新的属性在绑定(bind)控件的调度程序以外的线程上抛出 NotifyPropertyChanged,更新是否会被强制编码到此调度程序? BackgrounWorker.Run() => {
您好,我有一个 DataGridCheckBoxColumn,我希望它在用户选中或取消选中 DataGridCheckBoxColumn 时立即在基础绑定(bind)对象上通知 propertycha
似乎有些人在 Silverlight 中更新文本 AutoCompleteBox 时遇到问题,遗憾的是我已经加入了这个行列。 我有一个像这样的名为 EditableCombo 的派生类; publ
我的应用程序具有定期数据库同步功能。每当发生同步时,所有输入控件的值都会重置为数据库中的当前值。 但是,当在 TextBox 中键入长文本时发生同步事件时,这非常不方便。 期望的行为是输入控件的值不设
我有一个 UserControl,它包含 bool 属性 A。在包含该 UserControl 的主窗口中,我必须根据 A 的值启用/禁用按钮。我试图像这样将 A 设置为公开和绑定(bind)按钮:
我现在已经为我的问题苦苦挣扎了一个星期,但我无法解决它。我正在编写一个只有一个窗口 (MainView) 的 MVVM WPF 应用程序。在此 Mainview 中,我想在需要时加载不同的 UserC
我正在使用 Android 的数据绑定(bind)库。我的数据对象扩展了 BaseObservable。 public static class SimpleData extends BaseObse
在我的新 WPF 应用程序中,我重用了一个模型类。在该模型类中,所有属性都在其 setter 中触发 NotifyPropertyChanged。在我的应用程序中,我并没有真正为单个属性触发 INPC
是否有类似 INotifyPropertyChanged 的接口(interface),其中事件参数包含正在更改的属性的旧值,或者我是否必须扩展该接口(interface)来创建一个接口(inte
我有一个组件,其中包含一个子组件列表(在父组件中使用 yield 绘制): parent-component for item in items child-component item=
表格 Build your own MVVM我有以下代码可以让我们进行类型安全的 NotifyOfPropertyChange 调用: public void NotifyOfPropertyChan
这是一个简化的示例,但很好地说明了我的问题。我有一个 PIN 码输入,带有数字按钮(1、2、3、4)。我的按钮上的操作应该设置一个属性 pinValue ,该属性将传递到包装的组件 pin-input
我对 INotifyPropertyChanged 的 PostSharp 实现没有什么问题。 PostSharp 在编译时添加了 PropertyChangedEventHandler Proper
我对 WPF 非常熟悉,但有一件事困扰着我。我正在使用 ReactiveUI 引发 INotifyPropertyChanged 事件。我有两个地方与此类似: public UiModel UiMo
我是一名优秀的程序员,十分优秀!