绑定最佳做法的应用程序设置

时间:2017-01-10 20:07:29

标签: c# xaml mvvm windows-runtime uwp

我现在已经挣扎了一段时间,如何最好地和#34;互动"使用WinRT / UWP应用程序中的绑定级别设置。我一直在寻找有关此问题的最佳做法,但我找不到明确的答案。到目前为止,我在我的应用中所做的工作如下:

  1. 定义一个实现INotifyPropertyChanged的BindableBase。
  2. 创建一个继承自BindableBase的AppSettings类,看起来有点像这样:

    public class AppSettings : BindableBase
    {
        ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
    
        public string MySetting
        {
            get
            {
                if (!localSettings.Values.ContainsKey("MySetting"))
                    localSettings.Values["MySetting"] = "Some default value";
    
                return localSettings.Values["MySetting"].ToString();
            }
            set
            {
                localSettings.Values["MySetting"] = value;
                RaisePropertyChanged();
            }
        }
    }
    
  3. 定义一个具有AppSettings属性的ViewModel:

    public class SettingsViewModel
    {
        public AppSettings Settings { get; set; } = new AppSettings();
    }
    
  4. 绑定到视图中的“设置”属性:

    <TextBlock Text="{Binding Settings.MySetting, Mode=TwoWay}">
    
  5. 我曾经看过并使用过具有设置服务的实现,但这些应用程序并不需要立即生效的设置更改。所以我基本上要问的是:如果设置的更改应该立即生效,上述实现是否是绑定到设置的好方法?如果没有,你推荐什么?

2 个答案:

答案 0 :(得分:1)

这在一般情况下似乎很好。我唯一要做的就是只在数据实际发生变化时才提出通知:

set
{
    if (MySetting != value)
    {
        localSettings.Values["MySetting"] = value;
        RaisePropertyChanged();
    }
}

这样可以避免不必要地发出通知 根据读取值的频率,您可能希望保留自己的内存副本设置值(在私有字段中),而不是每次都从容器中读取它们。

答案 1 :(得分:0)

我对这篇文章非常感兴趣,所以我提出了一些更优雅的东西,以避免复制和粘贴属性名称(键)这么多次。我使用以下内容:

public class SettingsViewModel : BindableBase
{
    public string MyProperty
    {
        get
        {
            return Get("MyProperty", "SomeDefaultValue");
        }
        set
        {
            Set("MyProperty", value);
        }
    }

    public T Get<T>(string PropertyName, T DefaultValue)
    {
        //If setting doesn't exist, create it.
        if (!App.Settings.ContainsKey(PropertyName))
            App.Settings[PropertyName] = DefaultValue;

        return (T)App.Settings[PropertyName];
    }

    public void Set<T>(string PropertyName, T Value)
    {
        //If setting doesn't exist or the value is different, create the setting or set new value, respectively.
        if (!App.Settings.ContainsKey(PropertyName) || !((T)App.Settings[PropertyName]).Equals(Value))
        {
            App.Settings[PropertyName] = Value;
            OnPropertyChanged(PropertyName);
        }
    }
}

假设您的App类定义了以下属性:

public static IPropertySet Settings
{
    get
    {
        return Windows.Storage.ApplicationData.Current.LocalSettings.Values;
    }
}

后者比写作更方便,

ApplicationData.Current.LocalSettings.Values

仍然可以在全球范围内访问。