c# - 应用程序设置绑定(bind)最佳实践

标签 c# xaml mvvm windows-runtime uwp

一段时间以来,我一直在努力研究如何最好地与 WinRT/UWP 应用程序中绑定(bind)级别的设置“交互”。我一直在寻找这方面的最佳实践,但我还没有找到明确的答案。到目前为止,我在我的应用程序中所做的如下:

  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. 绑定(bind)到 View 中的设置属性:

    <TextBlock Text="{Binding Settings.MySetting, Mode=TwoWay}">
    

我过去曾看到并使用过具有设置服务的实现,但这些应用程序不需要设置更改立即生效。所以我基本上要问的是:如果对设置的更改应该立即生效,上面的实现是绑定(bind)到设置的好方法吗?如果没有,您有什么建议?

最佳答案

这篇文章给我很大的启发,所以我想出了一些更优雅的东西来避免多次复制和粘贴属性名称(键)。我使用以下内容:

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

并且仍然可以在全局范围内访问。

关于c# - 应用程序设置绑定(bind)最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577461/

相关文章:

wpf - 从xaml传递命令参数

c# - 使用 System.Drawing 从流中检测 CMYK

c# - C#和Java的Base64区别

c# - 将第一个数字替换为一个字节中的第二个数字

wpf - 使用混合编辑单独资源文件中的样式

wpf - 在弹出窗口外单击时如何关闭弹出窗口

c# - 如何仅使用 AspNet.Identity 在站点之间发送和接收身份验证票

wpf - 如何使用 XAML 在 WPF 中按首字母对 ListBoxItems 进行分组?

wpf - caliburn.micro 如何为 View 模型运行时加载和绑定(bind) View

wpf - 将 ViewModel 上的方法附加到 WPF 中的事件