【发布时间】:2014-04-08 18:03:42
【问题描述】:
我将属性绑定到 WPF 中的控件。通过 while 循环中的递归方法分配/更改属性的值。因此,值的分配速率约为 1 ms。大多数时候值根本没有改变,但是 setter 中的 propertychanged 事件即使在属性值没有改变的情况下也会触发。 我在想属性设置器应该仅在字段的值发生变化时引发事件。这是我的代码的简化版本:
public sealed class FX : System.ComponentModel.INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string PropertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(PropertyName));
}
}
private bool _someBool1 = false;
public bool SomeBool1
{
get { return _someBool1; }
set
{
_someBool1 = value;
OnPropertyChanged("SomeBool1");
//MessageBox.Show("SomeBool1 : propertychanged event fired!");
}
}
}
根据http://www.codemag.com/Article/0907101 UI 是 PropertyChanged 事件的消费者。虽然许多属性的值是不断且尽可能快地分配的,但这可能会导致不必要的 UI 开销。可以放置 OnPropertyChanged("SomeBool2");在 if 语句中? :
private bool _someBool2 = false;
public bool SomeBool2
{
get { return _someBool2; }
set
{
bool _someBool2OldValue = _someBool2;
_someBool2 = value;
if (_someBool2 != _someBool2OldValue)
{
OnPropertyChanged("SomeBool2");
//MessageBox.Show("SomeBool2 : propertychanged event fired!");
}
}
}
我是否误解了“属性值更改时触发事件”的想法,或者我的代码实现有误?
【问题讨论】:
-
嗯..看起来不错。您不需要 _someBool2OldValue 因为您可以询问 if(_someBool2 != value) {...} 但其余看起来不错嗯...
标签: c# wpf properties inotifypropertychanged