gpt4 book ai didi

c# - 编写可维护的提交方法

转载 作者:行者123 更新时间:2023-11-30 21:23:43 24 4
gpt4 key购买 nike

我有一个 ViewModel,它封装了一些正在选项对话框中编辑的属性。在他们点击 Ok 按钮之前,我实际上无法将它们保存到设置中,这将最终调用此特定 ViewModel 上的 Commit。

我的 ViewModel 中的单个属性如下所示:

public bool SomeProperty
{
get
{
return m_SomeProperty;
}
set
{
if (m_SomeProperty != value)
{
m_SomeProperty = value;
NotifyPropertyChanged("SomeProperty");
}
}
}
private bool m_SomeProperty = Properties.Settings.Default.SomeProperty;

所以 Commit 的正常实现是这样的:

public void Commit()
{
Properties.Settings.Default.SomeProperty = m_SomeProperty;
// Add other properties here...
}

这还不错,但我不喜欢这样的原因是如果你添加一个新的属性,你必须在两个地方为它添加代码。我尽量避免这种情况。

起初我以为我可以声明一个名为 OnCommit 的私有(private)事件并让 Commit 方法引发该事件,并让每个属性的代码为该事件添加一个事件处理程序并在那里写入设置,但我没有不知道如何在不在构造函数中添加事件处理程序的情况下做到这一点,这对这种情况没有帮助。

有什么想法吗?有没有人有一种优雅的方式来做我想做的事情?

编辑:感谢 sixlettervariables 的回答。我接受了这个想法并将其纳入SoapBox Core并将结果开源。查看选项对话框以了解其工作原理。

最佳答案

也许维护一个要执行的 Action 列表?

private List<Action> commitActions = new List<Action>();

public bool SomeProperty
{
get
{
return m_SomeProperty;
}
set
{
if (m_SomeProperty != value)
{
m_SomeProperty = value;
lock (commitActions)
{
commitActions.Add(
() => Properties.Settings.Default.SomeProperty = value);
}
NotifyPropertyChanged("SomeProperty");
}
}
}

然后更新您的 Commit 代码以循环执行操作。

public void Commit()
{
List<Action> commits;
lock (commitActions)
{
commits = new List<Action>(commitActions);
commitActions.Clear();
}

foreach (var commit in commits)
{
commit();
}
}

关于c# - 编写可维护的提交方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1601080/

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