gpt4 book ai didi

c# - 即使属性值未更改,也会触发 Propertychanged 事件

转载 作者:行者123 更新时间:2023-12-05 09:23:22 27 4
gpt4 key购买 nike

我将属性绑定(bind)到 WPF 中的控件。通过 while 循环中的递归方法分配/更改属性值。因此,值的分配速率约为 1 毫秒。大多数时间值根本不会更改,但即使属性值未更改,setter 中的 propertychanged 事件也会触发。我在想属性 setter 应该在一个字段的值要改变时引发一个事件。这是我的代码的简化版本:

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 的东西是用来做什么的:

set
{
if (_someBool2 != value)
{
_someBool2 == value;
OnPropertyChanged("SomeBool2");
}
}

此外,如果您正在运行某个循环,这会使您的 View 模型频繁更改属性,则完全停止触发 PropertyChanged 事件是有意义的:

protected bool StopFiringPropertyChanged { get; set; }

protected virtual void OnPropertyChanged(string propertyName)
{
if (StopFiringPropertyChanged)
{
return;
}

// fire event
}

并且仅在所有属性的循环结束后触发它,这些属性可以在循环期间更改:

private void SomeMethodWithRecursiveLoop()
{
StopFiringPropertyChanged = true;
try
{
// do the work
}
finally
{
StopFiringPropertyChanged = false;
OnPropertyChanged("SomeProperty1");
OnPropertyChanged("SomeProperty2");
OnPropertyChanged("SomeProperty3");
}
}

关于c# - 即使属性值未更改,也会触发 Propertychanged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22218787/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com