2017-01-10 53 views
0

我一直在努力一段時間,如何在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屬性:

    public class SettingsViewModel 
    { 
        public AppSettings Settings { get; set; } = new AppSettings(); 
    } 
    
  4. 綁定到設置屬性在視圖中:

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

我以前見過並使用過具有設置服務的實現,但這些應用程序不需要設置更改即可立即生效。所以我基本上要問的是:如果設置的更改應該立即生效,上述實現是綁定到設置的好方法嗎?如果不是,你推薦什麼?

+1

相關:[最佳實踐殭屍](http://meta.stackexchange.com/a/142354/1228)此外,可以使用你的意思*去實際的說明*。你的意思是立即保存嗎?我知道在WPF中,框架中沒有任何東西可以爲你做任何事情。你似乎已經有了應該工作的東西(ish?)。如果它沒有做你所需要的,那就改變它的代碼。 – Will

+0

我認爲你的實施是好的,並按照你的情況工作。如果您需要立即應用每個設置(而不是單擊保存按鈕),則必須在屬性集中分配新值(如您所用)。任何訂閱的監聽器都將在此時觸發屬性集中的更改。 –

+0

@我並不是在尋找最佳實踐,但是如果我的實施出現問題,因爲我覺得它在性能方面效率不高。 – Abdousamad

回答

1

這在一般情況下似乎很好。我會改變的唯一事情是隻提高了通知,如果數據實際上改變:

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

這將避免不必要地提高的通知。
根據讀取值的頻率,您可能希望將自己的設置值保存在私有字段中,而不是每次都從容器中讀取它們。

+0

將值存儲在專用字段中,並且僅在更改了ApplicationData時才更改ApplicationData,但實際上性能可能會更好一些。至於我的RaisePropertyChanged實現,如果我沒有記錯,它已經檢查一個設置是否已經改變,但我會檢查確認。 – Abdousamad

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 

而且仍然可以全局訪問。

相關問題