読者です 読者をやめる 読者になる 読者になる

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

.Net系プログラムで勉強したこととか嵌ったことについて書いたりします。

EmployeeDirectoryを弄ってみた

Xamarin

以前に書いた通り、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のサンプルは盛りだくさんといった感じです。

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

と思います。