はまったりひらめいたり…とか…

Angularや.NETやAzureやその他色々。

EmployeeDirectoryを弄ってみた

以前に書いた通り、EmployeeDirectoryのマージをしました。

ただ、思った以上にサンプルとしては内容が盛りだくさんな感じなので

ポイント部分と動作イメージだけさらっと

結果として、EmployeeDirectoryは入門編にはちょうどいい感じがしました。

構成

サンプルのソリューションの構成が今までのと違います。

UIとビジネスロジックをソリューションから分離している感じですね。
f:id:TakasDev:20160504192527p:plain
というかこのサンプル、ログイン画面込みの構成なんで

最初からこれを使えばよかった…と思ったのは別の話。

一応自分が作ったマージするほうも同様に、下図の様にUIとロジックで分離しました
f:id:TakasDev:20160504192701p:plain

これ関係ぜんぶ書き出すとめちゃくちゃ長くなりそうなので

一部だけ

ログイン画面の遷移

App.cs内の初期ページの指定として、ログイン画面ではなくMain画面を指定します

App.cs

public App()
{
    var task = Task.Run(async () => {
        //CSVをメモリに格納
        Service = await MemoryDirectoryService.FromCsv("XamarinDirectoryTemp.csv");
    });
    task.Wait();
    //ログインページではなくMainPageを指定
    MainPage = new NavigationPage(new MainPage());
}

また、上記で指定したMainPage.csのOnAppearingイベント内で

LoginPageをPush表示します。

これで、App起動時にLogin画面が開かれることになります。

MainPage.cs

protected async override void OnAppearing()
{
    base.OnAppearing();

    if (LoginViewModel.ShouldShowLogin(App.LastUseTime))
    {
        if (!LoginPageAdd) { 
            LoginPageAdd = true;
            //ログインページを表示
            await Navigation.PushModalAsync(new LoginPage());
        }
    }
    favoritesRepository = await XmlFavoritesRepository.OpenIsolatedStorage("XamarinFavorites.xml");

    if (favoritesRepository.GetAll().Count() == 0)
    {
        favoritesRepository = await XmlFavoritesRepository.OpenFile("XamarinFavorites.xml");
    }
    viewModel = new FavoritesViewModel(favoritesRepository, true);
}

ログイン成功時はPopModaiAsyncでMain画面に戻ります。

※単純にこの実装だけだと、Androidの「戻る」ボタン押下で
Main画面を見れてしまうのですが(^^;)
まぁその制御はおいおい。

PCLStorage

このサンプルでは、端末のローカルストレージにCSVファイルを落とし

CSVの内容からLINQでUserViewModelの配列を生成しています。

端末のローカルストレージに落とす場合

AndroidiOSで使用するAPIが違うのでしょうが

PCLStorageの機能を使用して

同一のロジックでファイル操作を行っているようです。

MemoryDirectoryService.cs

public async static Task<MemoryDirectoryService> FromCsv(string path)
{
    //PCLStorage機能を使用しファイル操作
    IFolder store = FileSystem.Current.LocalStorage;
    var file = await store.GetFileAsync(path);

    using (var reader = new StreamReader(await file.OpenAsync(FileAccess.Read)))
    {
        return FromCsv(reader);
    }
}

これは↓に格納されるようです。
f:id:TakasDev:20160504193938p:plain

動作させた

ログイン後はMasterDetailページとなります。

MasterDetailのサンプル画面から
f:id:TakasDev:20160504194110p:plain

EmployeeListの画面に遷移します。
(サンプルから中身弄ってないんで頭だけ出しときます)
f:id:TakasDev:20160504194137p:plain

まとめ

ページ遷移からファイル操作、ViewModelを使用したMVVMな作り等

EmployeeDirectoryのサンプルは盛りだくさんといった感じです。

なので、とっかかりとしてやる分には非常にいいのではないかな?

と思います。