設定画面 その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に持ち込むのは抵抗があるだろう。 次回は他の実装も考えてみよう。