繁体   English   中英

NotifyPropertyChanged未触发事件[PostSharp]

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM