SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C++/CX: Windows Runtime Componentをつくる

 それでは、できあがったCounterComponentを使ったストアアプリ:CounterAppを作りましょうか。前回のstep3からCounterAppプロジェクトを丸ごとコピーし、プロジェクトプロパティでCounterComponentを参照します。

 これでVisual StudioはConterComponentのトリセツである.winmdを読み、プロジェクトに抱き込んでくれます。ヘッダincludeパスの設定やライブラリのリンクなどは一切不要となるのは大きなメリットです。

 CounterViewModelは以下のように修正します。

CounterViewModel.h
#pragma once

#include "Common/RelayCommand.h"

namespace CounterApp {

    namespace cx {
      namespace xaml  = Windows::UI::Xaml;
      namespace data  = Windows::UI::Xaml::Data;
      namespace input = Windows::UI::Xaml::Input;
    }

    [Windows::UI::Xaml::Data::Bindable]
    public ref class CounterViewModel sealed : cx::data::INotifyPropertyChanged{
    public:
        CounterViewModel();

        virtual event cx::data::PropertyChangedEventHandler^ PropertyChanged;
        property int Count { int get(); }

        property cx::input::ICommand^ Increment  { cx::input::ICommand^ get(); }
        property cx::input::ICommand^ Decrement  { cx::input::ICommand^ get(); }

    private:
        void do_inc();
        void do_dec();

        void RaisePropertyChanged(Platform::String^ propertyName);

        CounterComponent::Counter counter_;    
    };

}
CounterViewModel.cpp
#include "pch.h"
#include "CounterViewModel.h"

using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Data;

namespace CounterApp {

    auto returnsTrue = [](Object^) { return true; };

    CounterViewModel::CounterViewModel() { }

    // property Count
    int  CounterViewModel::Count::get() { return counter_.Get(); }

    // property Increment/Decrement
    ICommand^ CounterViewModel::Increment::get() {
        return ref new Common::RelayCommand(returnsTrue, [this](Object^) { do_inc(); }); 
    }
    ICommand^ CounterViewModel::Decrement::get() {
        return ref new Common::RelayCommand(returnsTrue, [this](Object^) { do_dec(); });
    }

    // increment/decrement counter
    void CounterViewModel::do_inc() {
        int curr = counter_.Get();
        counter_.Increment(); 
        if (curr != counter_.Get()) {
            RaisePropertyChanged(L"Count");
        }
    }

    void CounterViewModel::do_dec() {
        int curr = counter_.Get();
        counter_.Decrement();
        if (curr != counter_.Get()) {
            RaisePropertyChanged(L"Count");
        }
    }

    void CounterViewModel::RaisePropertyChanged(String^ propertyName) {
        PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
    }
}

 ...はい、できあがり。

次のページ

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7541 2013/12/26 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー