C# PropertyChanged始终被激发
我正在使用INotifyPropertyChanged的标准通知模式。以下是我的示例属性:C# PropertyChanged始终被激发,c#,windows-phone-8,inotifypropertychanged,win-universal-app,C#,Windows Phone 8,Inotifypropertychanged,Win Universal App,我正在使用INotifyPropertyChanged的标准通知模式。以下是我的示例属性: private string fanart; public string Fanart { get { return fanart; } set { if (fanart != value) { fanart = value; NotifyPropertyChanged("Fanart");
private string fanart;
public string Fanart
{
get { return fanart; }
set
{
if (fanart != value)
{
fanart = value;
NotifyPropertyChanged("Fanart");
}
}
}
在这里,如果新值等于当前值,我希望setter跳过所有内容。但是,当我使用调试器检查时,fanart
总是等于null
,因此,事件总是被触发。文件(和财产)无效的任何原因
编辑:此属性是名为PlayerItem
的类的一部分PlayerItem
是另一个类PlayerState
的一部分。所有这些类都从NotifyBase
扩展而来。方法RefreshPlayerState
定期刷新PlayerState
。我刚刚注意到每次刷新播放器状态时都会创建新的PlayerItem
实例。这可能是什么原因造成的
Edit2:由于我正在从JSON响应反序列化对象,因此需要创建新实例。现在,如果旧值等于从JSON反序列化的值,如何防止setter设置该值<代码>myObj!=值将始终返回true,因为尽管包含的数据相同,但两者都是不同的对象
此代码是项目的一部分。请随时查看更多详细信息。“fanart
始终等于null
”表示您很可能正在重新创建拥有此字段的类的实例(我假定它是您的视图模型)。您应该保留对绑定VM的引用,并处理该实例
编辑:目前我正在使用Windows 7计算机,因此无法看到您的代码。但是你正在把那些玩家转移到某个地方;您在
PlayerHelper
和Player
类中创建的那些。此代码中没有问题,有更多详细信息吗?如何绑定它?一个非常简单的测试是o.Fanart=“abc”;o、 Fanart=“abc”
并查看触发属性更改的频率。在这种情况下,您会发现事件不会引发两次。我猜您正在创建类的新实例,这些新实例自然没有任何默认的Fanart
值。您为其提供链接的代码不包含if(…)
语句。此外,搜索项目后发现您从未显式设置此属性。仅反序列化。@akshay2000如果我没记错,反序列化从默认构造函数实例化对象,然后使用反射指定属性。因此,在反序列化时,您的属性将从null变为value。正确!我正在从JSON响应进行反序列化。所以,这是意料之中的。现在,问题是如何确保setter不设置值?由于旧对象与新对象不同,myObj!=值
将始终返回true。@akshay2000这取决于您的实现,您可能需要检查所有属性等。。。但是你的问题已经完全回答了,你可以记下来。