none
用户设置保存成功后,再次进入修改设置页面时,读取的还是设置默认值 RRS feed

  • 问题

  • Hi 大家好,

    我希望在程序内修改并保存程序设置,修改,保存,设置的值会改变,可是当我想再次修改时,进入到了修改界面,程序设置读取的值却是默认值(并不是我修改过的值),所有设置的scope都是user,类型也都是string类型,请问这是为什么呢?我把我的代码贴上来供大家参考:

    Model:

    public class SettingProperties : INotifyPropertyChanged
        {
            private string _name;
    
            public string Name
            {
                get { return _name; }
                set
                {
                    _name = value;
                    Notify("Name");
                }
            }
    
            private object _value;
    
            public object Value
            {
                get { return _value; }
                set
                {
                    _value = value;
                    Notify("Value");
                }
            }
    
            public SettingProperties(string name,  object value)
            {
                this.Name = name;
                this.Value = value;
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void Notify(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }

    ViewModel:

     public class SettingsViewModel : ViewModelBase
        {
            public ICommand SaveCommand { get; set; }
    
            public SettingsViewModel()
            {
                this.SaveCommand = new DelegateCommand(onSaveCommandExecuted);
            }
    
            private void onSaveCommandExecuted(object obj) //保存程序设置的值
            {
                foreach (var item in PropertiesList)
                {
                    Properties.Settings.Default[item.Name] = item.Value;
                    Properties.Settings.Default.Save();
                }
    
                System.Diagnostics.Process.Start(Application.ResourceAssembly.Location); //重启程序使设置生效
                Application.Current.Shutdown();
            }
    
            private ObservableCollection<SettingProperties> _property;
    
            public ObservableCollection<SettingProperties> PropertiesList
            {
                get
                {
                    if (this._property == null)
                    {
                        this._property = this.CreateProperties();
                    }
    
                    return this._property;
                }
            }
    
            private ObservableCollection<SettingProperties> CreateProperties()  //读取程序设置并将他们的名字和值保存在集合中
            {
                ObservableCollection<SettingProperties> properties = new ObservableCollection<SettingProperties>();
                SettingProperties property;
                System.Collections.IEnumerator en = Properties.Settings.Default.Properties.GetEnumerator();
    
                while (en.MoveNext())
                {
                    System.Configuration.SettingsProperty setting = (System.Configuration.SettingsProperty)en.Current;
                    property = new SettingProperties(setting.Name, setting.DefaultValue);
                    properties.Add(property);
                    
                }
    
                return properties;
            }
        }

    View就不贴出来了,是用的一个第三方插件的listview,只绑定了name和value。

    2019年1月22日 15:36

答案

  • 查了查文档,问题解决了。关键在于SETTINGS是只读的,当SCOPE是USER并且在程序内用SAVE保存SETTING后,SETTING保存的只是SESSION值,这导致了当再次读取SETTING的时候是默认值的问题。MSDN文档说明
    • 已标记为答案 CZAupup 2019年1月29日 15:58
    2019年1月29日 15:58

全部回复

  • Hello,

    根据你的描述和代码, 你说你的设置值会改变,但是当进入修改页面, 现实的还是默认值, 我觉得你的设置值改变的代码没有问题, 实现了通知, 问题可能出现在设置值改变以后保存的地方,请提供一下你是在哪里修改设置值, 并且在哪里进行修改的。

    因为我只看到你读取了默认的程序设置值。

    Best Regards,

    Cherry


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年1月23日 8:49
    版主
  • Hi Cherry,

    修改功能是我用的第三方控件自带的,通过VIEW修改的,listview上绑定着我的设置集合,我通过view上的listview修改值,再历遍我的设置集合来保存每一个设置的值。当程序通过这个页面修改了程序设置值后,这些设置值会生效(这意味着程序设置值确实修改过了)我可能问题描述的不清楚,我的问题是:

    程序设置的值已经生效并保存了,但是当我reload这个页面时,程序读取的设置值却还是默认的设置值。

    2019年1月23日 15:21
  • Hello,

    根据你的描述和你上面的代码, 我没有办法确定到底是哪里出现了问题, 如果你能上传一个能够重现你这个问题的demo的话, 这将非常有利于我分析你的问题。

    Best Regards,

    Cherry


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年1月29日 8:13
    版主
  • 查了查文档,问题解决了。关键在于SETTINGS是只读的,当SCOPE是USER并且在程序内用SAVE保存SETTING后,SETTING保存的只是SESSION值,这导致了当再次读取SETTING的时候是默认值的问题。MSDN文档说明
    • 已标记为答案 CZAupup 2019年1月29日 15:58
    2019年1月29日 15:58