汽车属性?不,我不会,但在单例上使用二传手,是的,我做到了。我认为你想要对它进行更多的控制,而不是汽车属性会给你的。
...请在这里非常欢迎建设性的反馈。在这家受人尊敬的公司中,这感觉像是一个勇敢(或愚蠢)的举动......
我的场景是一个 WPF 应用程序,它有一个可以加载和保存的当前项目。当前项目设置在整个应用程序中使用...
- 在 UI 中的 WPF 绑定中,因此用户可以更改设置,从而更改
INotifyPropertyChanged
界面。
- 我也使用Fody.PropertyChanged但这不会更改静态属性,因此
NotifyStaticPropertyChanged
.
INotifyPropertyChanged
与单例属性上的 WPF 绑定一起工作正常。
- 的一个实例
Settings
使用 JSON.NET [反]序列化,因此[JsonIgnore]
是单例上的属性。我在将其加载到单例或将其保存到磁盘之前对其进行验证。
- 记录器是Serilog。你记录东西,对吧?
- 单例
public
带有public
getter,因为 WPF 绑定仅适用于公共属性。设置器internal
不会影响它。的所有属性Settings
对于 WPF 绑定都是公共的。
我在代码中留下了所有的“噪音”,因为有些人可能会觉得它很有用。
class Settings : INotifyPropertyChanged
{
private static Settings _currentSettings = new Settings();
/// <summary> The one and only Current Settings that is the current Project. </summary>
[JsonIgnore] // so it isn't serialized by JSON.NET
public static Settings CurrentSettings // http://csharpindepth.com/Articles/General/Singleton.aspx
{
get { return _currentSettings; }
// setter is to load new settings into the current settings (using JSON.NET). Hey, it works. Probably not thread-safe.
internal set
{
Log.Verbose("CurrentSettings was reset. Project Name: {projectName}", value.ProjectName);
_currentSettings = value;
_currentSettings.IsChanged = false;
NotifyStaticPropertyChanged("CurrentSettings");
}
}
// http://10rem.net/blog/2011/11/29/wpf-45-binding-and-change-notification-for-static-properties
/// <summary> Fires when the Curent CurrentTvCadSettings is loaded with new settings
/// Event queue for all listeners interested in StaticPropertyChanged events. </summary>
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged = delegate { };
private static void NotifyStaticPropertyChanged(string propertyName)
{
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}
// various instance properties including ....
public string ProjectName {get; set;}
[JsonIgnore]
public bool IsChanged { get; set; }
}
将单例设置为新加载的项目的用法settings
很简单
Settings settings = new Settings();
// load, save, deserialize, set properties, go nuts
Settings.CurrentSettings = settings;
setter 可能不是线程安全的,但我只将它设置在 UI 线程的一个地方,所以我不害怕。您可以按照http://cshapindepth.com/Articles/General/Singleton.aspx上的建议使其线程安全
我意识到 OP 没有询问 WPF,但我认为这与说明为什么您可能想要设置一个单例有关。我这样做是因为它是最简单的解决方案。