- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在重写我当前的程序以使用 MVVM,我是 MVVM 的新手 - 我对它感到非常不知所措,所以如果这是显而易见的,我深表歉意......发生的事情是一件好事,不是坏事......但我想了解为什么会这样。 :)
我现在只有一些非常基本的东西。我有我的 View 模型,我已经开始构建一个模型来查看存储在 properties.settings.default 中的值...
这是我的 View 模型中的一个方法:
private static void UpgradeApplicationSettingsIfNecessary()
{
// Application settings are stored in a subfolder named after the full #.#.#.# version number of the program. This means that when a new version of the program is installed, the old settings will not be available.
// Fortunately, there's a method called Upgrade() that you can call to upgrade the settings from the old to the new folder.
// We control when to do this by having a boolean setting called 'NeedSettingsUpgrade' which is defaulted to true. Therefore, the first time a new version of this program is run, it will have its default value of true.
// This will cause the code below to call "Upgrade()" which copies the old settings to the new.
// It then sets "NeedSettingsUpgrade" to false so the upgrade won't be done the next time.
UserSetting Setting = new UserSetting();
if (Setting.NeedSettingsUpgrade)
{
Properties.Settings.Default.Upgrade();
System.Windows.Forms.MessageBox.Show("Settings Upgraded");
Setting.NeedSettingsUpgrade = false;
}
}
(是的,它是从某处借来的代码)。本质上,我有一个设置存储在 settings.settings 中,默认为 true。如果它是真的,我会升级用户设置,以便它们在版本之间保持不变。 (我的版本已经随着程序的构建而递增)。
这是我的模型:
class UserSetting : INotifyPropertyChanged
{
private bool needSettingsUpgrade;
//Initiates the instance.
public UserSetting()
{
NeedSettingsUpgrade = Properties.Settings.Default.NeedSettingsUpgrade;
}
public bool NeedSettingsUpgrade
{
get
{
return needSettingsUpgrade;
}
set
{
needSettingsUpgrade = value;
Properties.Settings.Default.Save();
OnPropertyChanged("NeedSettingsUpgrade");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
所以...我认为我将不得不在某个时候写:
Properties.Settings.Default.NeedSettingsUpgrade = false;
然而事实并非如此。我在 View 模型中添加了消息框,这样我就可以看到设置是否被保存,它确实被保存了。我构建程序(给它一个新的版本号,因此将 settings.settings 重置为默认值,所以 NeedSettingsUpgrade 是真的)。我运行程序,看到消息框并关闭它。然后我在没有重建的情况下再次运行它,在我重建并获得新版本号之前我看不到消息框。
您能向我解释一下为什么我不需要添加额外的代码行来将错误值存储到用户设置中吗?为什么它被更新为 false?我这辈子都想不通为什么!
再次强调,这是我想要的,而不是我期望的。
最佳答案
如果没有完整的代码示例,就很难确定发生了什么,也很难确保完全理解您的要求。但是,根据您的描述:
I ran the program, saw the messagebox and closed it. Then I ran it again without rebuilding, and I see no messagebox until I rebuild and get a new version number.
这强烈表明正在执行 UpgradeApplicationSettingsIfNecessary()
方法:
private static void UpgradeApplicationSettingsIfNecessary()
{
// Application settings are stored in a subfolder named after the full #.#.#.# version number of the program. This means that when a new version of the program is installed, the old settings will not be available.
// Fortunately, there's a method called Upgrade() that you can call to upgrade the settings from the old to the new folder.
// We control when to do this by having a boolean setting called 'NeedSettingsUpgrade' which is defaulted to true. Therefore, the first time a new version of this program is run, it will have its default value of true.
// This will cause the code below to call "Upgrade()" which copies the old settings to the new.
// It then sets "NeedSettingsUpgrade" to false so the upgrade won't be done the next time.
UserSetting Setting = new UserSetting();
if (Setting.NeedSettingsUpgrade)
{
Properties.Settings.Default.Upgrade();
System.Windows.Forms.MessageBox.Show("Settings Upgraded");
Setting.NeedSettingsUpgrade = false;
}
}
该方法不仅将 NeedSettingsUpgrade
属性设置为 false
,您甚至还有一条对此进行详细描述的评论。
然后在该属性的 setter 中:
set
{
needSettingsUpgrade = value;
Properties.Settings.Default.Save();
OnPropertyChanged("NeedSettingsUpgrade");
}
您调用 Properties.Settings.Default.Save()
。
Can you explain to me why I don't ned to add that extra line of code to store the false value into the usersetting? Why is it being updated to false?
从上面可以明显看出为什么您不需要任何额外的代码“将错误值存储到用户设置中”。 UserSetting.NeedSettingsUpdate
属性由您发布的代码明确设置。
现在,您可能实际上想知道为什么您不需要在调用 Save()< 之前实际设置
方法。Properties.Settings.Default.NeedSettingsUpgrade
属性
那个,没有a good, minimal, complete code example就没人能回答.没有一个,就无法解释为什么您不需要任何额外的代码来做到这一点。
根据您的描述,可以说的是,该属性显然是在某处设置的。此外,根据您的描述,以下两件事中的一件最有可能是正确的:
Properties.Settings.Default.Upgrade()
方法中将 Properties.Settings.Default.NeedSettingsUpgrade
属性设置为 false
.Properties.Settings.Default.NeedSettingsUpgrade
属性在某处绑定(bind)到 UserSetting.NeedSettingsUpdate
属性并以这种方式设置。因为只有在设置 UserSetting.NeedSettingsUpdate< 后继续调用
属性(因为 setter 在引发通知事件之前调用了 Properties.Settings.Default.Save()
时,#2 选项才有效Save()
),我的钱在 #1 上。这意味着您已经在某处覆盖了该方法并将 NeedSettingsUpgrade
设置属性设置为 false
。
但如果没有看到该代码,就无法确定。
关于c# - 为什么在这种情况下会保存我的设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28918801/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!