設定画面 その2
とシンプルな構成。あとはAppSettingsクラスを好きな画面のコントロールにデータバインドするだけと簡単だ。
殆どがルーティーンなので、これも他のコード同様にもう少しスマートに書けないかを考えてみよう。
ということで考えて見たが、すぐに出てくるのは簡単な方。
ViewModel継承クラス
IsolatedStorageSettingsのIO処理をViewModel継承クラスに移動しただけのシンプルなものだ。
-
- AppSettingsViewModel.cs
public class AppSettingsViewModel : ViewModel { protected IsolatedStorageSettings _isolatedStore; public AppSettingsViewModel() : base() { _isolatedStore = IsolatedStorageSettings.ApplicationSettings; } public bool AddOrUpdateValue(string key, Object value) { bool valueChanged = false; if (_isolatedStore.Contains(key)) { if (_isolatedStore[key] != value) { _isolatedStore[key] = value; valueChanged = true; } } else { _isolatedStore.Add(key, value); valueChanged = true; } return valueChanged; } public T GetValueOrDefault<T>(string key, T defaultValue) { T value; if (_isolatedStore.Contains(key)) { value = (T)_isolatedStore[key]; } else { value = defaultValue; } return value; } public void Save() { _isolatedStore.Save(); } }
設定画面のためのVideModelはこのクラスをベースにすることで、IsolatedStorageSettingsへのIO処理を用意する必要がなくなる。また、プロパティのアクセサはルーティーンになるので、テンプレートによる自動生成の対象にできそうだ。(これは追ってまた)
例) Nameプロパティのセット時
public String Name { get { return GetValueOrDefault<string>("Name", ""); } set { ValidateProperty("Name", value); AddOrUpdateValue("Name", value); Save(); NotifyPropertyChanged("Name"); } }
ViewModelを継承することで実装は簡単になるが、MVVMということを考えるといくらIsoratedStrageといえど永続化の処理をViewModelに持ち込むのは抵抗があるだろう。 次回は他の実装も考えてみよう。