gpt4 book ai didi

c# - INotifyPropertyChanged 未触发 PropertyChanged

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:23 24 4
gpt4 key购买 nike

我在论坛中搜索了解决方案,但列出的解决方案均无济于事。我假设我的实现已关闭,但我不明白是什么或为什么。

使用 Xamarin 表单,我试图在对象的数据发生更改时获取要更新的标签。

相关代码:

public new event PropertyChangedEventHandler PropertyChanged;

protected new virtual void OnPropertyChanged(string propertyName)
{
System.Diagnostics.Debug.WriteLine ("Before");
if (PropertyChanged != null)
{
System.Diagnostics.Debug.WriteLine ("Fired");
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}

public string String {
set {
if (_data == value)
return;
_data = value;
OnPropertyChanged ( "String" ); }

get { return _data; }
}

public new View Content {
get {
label = new Label { Text = String };
label.SetBinding( Label.TextProperty, new Binding( "String" ) );
return label;}
}

基本上,“Before”会打印到控制台,但不会打印“Fired”。这意味着 PropertyChanged 为 null,因此没有触发 PropertyChanged。

我错过了什么?

最佳答案

我不知道这是否会影响它(可能不会),但我会将您的属性更改方法重写为以下内容。

protected new virtual void OnPropertyChanged(string propertyName)
{
System.Diagnostics.Debug.WriteLine ("Before");
var handler = this.PropertyChanged;
if (handler == null)
{
return;
}

System.Diagnostics.Debug.WriteLine ("Fired");
handler(this,
new PropertyChangedEventArgs(propertyName));
}

获取事件的本地引用将在多线程环境中保护您。这是最佳实践,即使您不编写多线程代码也是如此。这是处理事件时更安全的方法。

参见 this answer关于它的 Stackoverflow。

The assignment to a local variable ensures that if the event gets unregistered between the if and the actual invocation, the invocation list will not be null (since the variable will have a copy of the original invocation list).

This can easily happen in multithreaded code, where between checking for a null and firing the event it may be unregistered by another thread.

接下来,我会将属性从 String 重命名为其他名称。我相信 Xamarin 的 .NET 框架实现包括 BCL 类型字符串。您可能会混淆绑定(bind)引擎,尽管它应该足够聪明以识别差异。

此外,请确保 Binding 成员的方向设置为 Two-Way 并将其更新更改通知设置为 PropertyChanged。这将确保在更改属性值时始终触发 OnPropertyChanged 方法。

new Binding("String")
{
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.Explicit,
}

关于c# - INotifyPropertyChanged 未触发 PropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31255646/

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