設定画面 その3

さて、設定画面の設定値をロード/セーブする処理だが昨日はViewModelに直接組込んで使う例を考えてみた。今日はViewModelには組込まず、コマンドとして実装することを考えてみよう。

まずはIsolatedStorageSettingsのIO処理を組込んだコマンドクラスを作ろう。
以前に用意したRelayCommandジェネリッククラスを継承することで簡単に書くことができる。

AppSettingsCommand.cs
    public class AppSettingsCommand<T> : RelayCommand<T>
	{
        protected IsolatedStorageSettings _isolatedStore;
        public AppSettingsCommand(Action<T> execute, Predicate<T> canExecute) 
            : base(execute, canExecute)
        {
            _isolatedStore = IsolatedStorageSettings.ApplicationSettings;
        }
        public AppSettingsCommand(Action<T> execute) 
            : base(execute)
        {
            _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();
        }
    }

このクラスをベースクラスとしてコマンドの種類に合わせて派生クラスを起こせば良い。

AppSettingsLoadCommand.cs (データのロード用)
    public class AppSettingsLoadCommand : AppSettingsCommand<ViewModel>
    {
        public AppSettingsLoadCommand()
            : base(null)
        {
            _execute = vm =>
            {
                vm.プロパティ = GetValueOrDefault("プロパティ", "");
                : 
                //ここで全てのプロパティを読み出す
            };
        }
    }
AppSettingsSaveCommand.cs (データのセーブ用)
    public class AppSettingsSaveCommand : AppSettingsCommand<ViewModel>
    {
        public AppSettingsSaveCommand()
            : base(null)
        {
            _execute = vm =>
            {
                AddOrUpdateValue("プロパティ", vm.プロパティ);
                : 
                //全てのプロパティを書き出す
                Save();
            };
        }
    }

あとは必要なイベント発生時にこれらのコマンドを明示的に実行すればOKだ。
次は実際の画面と組合わせて処理を完成させてみよう。