![](/img/trans.png)
[英]AOP w/ PostSharp - Classic NotifyPropertyChanged PropertyChanged Event Handler Missing?
[英]NotifyPropertyChanged not firing event [PostSharp]
我是PostSharp的新手(刚刚获得了许可证),我一直在尝试在自己的应用程序中使用它。 我有以下设置类:
[NotifyPropertyChanged]
public class Consts
{
public string test2 {get; set;} = "foobar";
public string test
{
get { return GetValue("test"); }
set { UpdateSetting(nameof(test), value.ToString(CultureInfo.InvariantCulture)); }
}
[Pure]
public static string GetValue(string s) => ConfigurationManager.AppSettings[nameof(s)];
[Pure]
private static void UpdateSetting(string key, string value)
{
var cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
cfg.AppSettings.Settings[key].Value = value;
cfg.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
}
然后在我的订户类上:
var cst = new Consts();
Post.Cast<Consts, INotifyPropertyChanged>(cst).PropertyChanged +=
(o, args) => Debug.Write("PropertyChanged fired");
cst.test = "test test"; // Gives no result
cst.test2 = "test test"; // Event firing correctly
当我在我的getters和setters方法中使用方法时,该事件不会触发,尽管标记为纯方法,但当它是一个简单属性时,效果很好。
我花了最后一天搜寻Google的答案,但没有运气。 没有线程可以解决我的问题。
我想念什么?
[NotifyPropertyChanged]
方面检测到对类字段的更改,然后根据检测到的依赖项(属性值取决于该特定字段)触发适当的事件。
在您的情况下,这恰恰是test2
属性的作用,以及aspect对该属性起作用的原因。
另一方面, test
属性无法自动运行。 该属性的值取决于ConfigurationManager.AppSettings.Item
。 第一个问题是AppSettings
是静态属性,即无法检测到对其的更改。 如果假定它永远不会更改,那么第二个问题是NameValueCollection
没有实现INotifyPropertyChanged
,这意味着无法知道该值实际上已更改。
您没有收到任何警告,因为您已将这两种方法都标记为“ Pure
,这在通常的意义上都不是。 GetValue
使用全局可变状态。 SetValue
更改全局可变状态。
由于无法挂钩到AppSettings
来接收对集合的更改,因此在设置属性后,您需要引发更改的通知。 这可以通过调用NotifyPropertyChangedServices.SignalPropertyChanged
方法来完成。 您的代码将如下所示:
[NotifyPropertyChanged]
public class Consts
{
public string test2 { get; set; } = "foobar";
public string test
{
get { return GetValue("test"); }
set { UpdateSetting(nameof(test), value.ToString(CultureInfo.InvariantCulture)); }
}
[SafeForDependencyAnalysis]
public string GetValue(string s) => ConfigurationManager.AppSettings[nameof(s)];
private void UpdateSetting(string key, string value)
{
var cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
cfg.AppSettings.Settings[key].Value = value;
cfg.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
NotifyPropertyChangedServices.SignalPropertyChanged(this, key);
}
}
请注意,如果存在Consts
类的多个实例,则它们将不会共享更改,因此无法通过ConfigurationManaged
传递该信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.