Prism for Windows Runtimeを使ったODataの更新アプリサンプル

サンプルプログラムの概要このサンプルプログラムは、http://www.odata.org/odata-services/のOData(read/write)で定義されているPersonエンティティを読み込んでNameプロパティを編集するサンプルプログラムです。以下のような動作をします。起動直後は、何も表示されません。アプリバーに表示されている読み込みボタンを選択すると、データが読み込まれて表示されます。読み込まれたデータを選択するとNameプロパティの編集用画面に遷移します。データを編集して、アプリバーの保存ボタンを選択すると、データがサーバーに反映さ

C# (114.3 KB)
 
 
 
 
 
(0)
37 times
Add to favorites
10/10/2014
E-mail Twitter del.icio.us Digg Facebook
using Microsoft.Practices.Prism.Commands;
using Microsoft.Practices.Prism.Mvvm;
using Microsoft.Practices.Prism.Mvvm.Interfaces;
using ODataReadWriteSampleApp.Models;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.UI.Xaml.Navigation;

namespace ODataReadWriteSampleApp.ViewModels
{
    /// <summary>
    /// 編集ページ
    /// </summary>
    public class EditPageViewModel : ViewModel
    {
        /// <summary>
        /// Modelのルート
        /// </summary>
        private AppContext model;

        /// <summary>
        /// 画面遷移のためのサービス
        /// </summary>
        private INavigationService navigationService;

        /// <summary>
        /// 変更をサーバーに反映する処理のコマンド
        /// </summary>
        public DelegateCommand CommitCommand { get; private set; }

        private PersonViewModel editTarget;

        /// <summary>
        /// 現在の編集対象
        /// </summary>
        public PersonViewModel EditTarget
        {
            get { return this.editTarget; }
            set { this.SetProperty(ref this.editTarget, value); }
        }

        /// <summary>
        /// デザインタイム用コンストラクタ
        /// </summary>
        public EditPageViewModel()
        {
            if (!DesignMode.DesignModeEnabled)
            {
                throw new InvalidOperationException();
            }
        }

        /// <summary>
        /// モデルと画面遷移のサービスで初期化するコンストラクタ
        /// </summary>
        /// <param name="model"></param>
        /// <param name="navigationService"></param>
        public EditPageViewModel(AppContext model, INavigationService navigationService)
        {
            this.model = model;
            this.navigationService = navigationService;

            this.CommitCommand = DelegateCommand.FromAsyncHandler(this.CommitExecuteAsync);
        }

        public override async void OnNavigatedTo(object navigationParameter, NavigationMode navigationMode, Dictionary<string, object> viewModelState)
        {
            base.OnNavigatedTo(navigationParameter, navigationMode, viewModelState);
            // サスペンドからの復帰のときはデータを読み込む
            if (navigationMode == NavigationMode.Refresh)
            {
                await this.model.PeopleModel.LoadPeopleAsync();
            }

            // 指定したIDのPersonを編集対象に設定する
            var id = (int)navigationParameter;

            this.model.PeopleModel.SetEditTarget(id);
            this.EditTarget = new PersonViewModel(this.model.PeopleModel.EditTarget);
        }

        public override void OnNavigatedFrom(Dictionary<string, object> viewModelState, bool suspending)
        {
            base.OnNavigatedFrom(viewModelState, suspending);
            // 編集対象をリセットする
            this.model.PeopleModel.EditTarget = null;
        }

        /// <summary>
        /// サーバーに変更を反映する
        /// </summary>
        /// <returns></returns>
        private async Task CommitExecuteAsync()
        {
            // VM -> Mへ変更内容を反映
            this.EditTarget.ApplyChanged();
            // 編集対象のデータの変更をサーバーに反映
            await this.model.PeopleModel.SaveEditTargetChangsAsync();
            // 一覧ページへ戻る
            this.navigationService.GoBack();
        }

    }
}