東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

Visual Studio 11 から本気出す! WPF with C++/CLI



レビューやらせていただきましたよ。
んで、せっかくだから「周回遅れにもほどがあんぞヲイ」なWPFに手を付けます。
いやね、Visual Studio 11でよぅやっとC++/CLIのインテリセンスが復活してくれたんで、
マンドクセーことやる気になったっちゅーのが本音。
てかさ、WPFアプリケーションてばC++の出番ナシなのが癪に障るんで、
ひな形生成だけをC#にやらせ、残りはぜーんぶC++/CLIで書いてみるココロミ。

おためしにこしらえたのは毎度毎度のカウンター。
「3.2.3 視覚的デザインツールの利用」にあったMVVMをほとんどそのままパクらせてもらいました。

<Window x:Class="DataBindingSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="データ バインディング サンプル" Width="193" SizeToContent="Height" Height="157">
    <StackPanel>
        <TextBox Text="{Binding Count}" FontSize="36" FontWeight="Bold" TextAlignment="Center" />
        <Button Content="+" Command="{Binding IncCommand}" />
        <Button Content="-" Command="{Binding DecCommand}" />
    </StackPanel>
</Window>

XAMLはこんな↑カンジね、表示とボタンをそれぞれ CountとIncCommand/DecCommandにバインドしてます。
以降C#からはしばらくオサラバ、C++/CLIでCLRクラスライブラリを用意して参照させます。
ViewModel がコレ↓

#ifndef MAINWINDOWVIEWMODEL_H__
#define MAINWINDOWVIEWMODEL_H__

namespace DataBindingSample {

  public ref class MainWindowViewModel : public System::ComponentModel::INotifyPropertyChanged {
  public:
    property int Count {
      int get();
      void set(int value);
    }

    virtual event System::ComponentModel::PropertyChangedEventHandler^ PropertyChanged;

    void attachCommand(System::Action<Object^>^ inc, System::Action<Object^>^ dec);
    void Update(int count);

    property System::Windows::Input::ICommand^ IncCommand 
      { System::Windows::Input::ICommand^ get(); }
    property System::Windows::Input::ICommand^ DecCommand 
      { System::Windows::Input::ICommand^ get(); }

  private:
    int _Count;
    System::Windows::Input::ICommand^ incCommand;
    System::Windows::Input::ICommand^ decCommand;
  };
 
}

#endif

attachCommandでView(のIncCommand/DecCommand)からModelに、
UpdateでModel(のカウント値変更)をViewに飛ばします。

カウンタ本体:Counter と ViewModelに接続するための CounterModel はそれぞれ:

#ifndef COUNTER_H__
#define COUNTER_H__

namespace DataBindingSample {

  public ref class Counter {
  public:
    void inc();
    void dec();
    int count();

  private:
    int count_;
  };

  public ref class CounterModel : Counter {
  public:

    // Model→ViewModel
    event System::Action<int>^ CountUpdatedHandler;

    // ViewModel→Model 
    property System::Action<Object^>^ Increment { System::Action<Object^>^ get(); }
    property System::Action<Object^>^ Decrement { System::Action<Object^>^ get(); }

  private:

    void Notify();

    void inc(Object^ dummy);
    void dec(Object^ dummy);

  };

}

#endif

CountUpdateHandlerとIncrement/Decrement がViewModelとの接続ポートになってます。

んでもって MainWindow, MainWindowViewModel, CounterModel をがしゃがしゃ繋ぐトコ
をC#側にねじ込みます。 MainWindowViewModel と CounterModel は App のstaticメンバ
にしちゃいました。

/* 
 * App.xaml.cs
 */
using System.Windows;

namespace DataBindingSample {

  public partial class App : Application {

    public static MainWindowViewModel ViewModel {
      get { 
        if ( viewmodel_ == null )
          viewmodel_ = new MainWindowViewModel();
        return viewmodel_;
      }
    }

    public static CounterModel Model {
      get {
        if ( model_ == null )
          model_ = new CounterModel();
        return model_;
      }
    }

    public static MainWindowViewModel viewmodel_;
    public static CounterModel model_;
  }

}

/*
 * MainWindow.xaml.cs
 */
using System.Windows;

namespace DataBindingSample {

  public partial class MainWindow : Window {
    public MainWindow() {
      InitializeComponent();
      this.DataContext = App.ViewModel;
      App.ViewModel.attachCommand(App.Model.Increment, App.Model.Decrement);
      App.Model.CountUpdatedHandler += App.ViewModel.Update;
    }
  }

}

C++/CLI側の実装(.cpp)は割愛。ソリューションまるごとうpするから読んでやって。

白状すればMVVMってハジメテなの。おもきし我流だし。ガスガス突っ込んでやってくだせ。

投稿日時 : 2012年4月28日 23:51

コメントを追加

# re: Visual Studio 11 から本気出す! WPF with C++/CLI 2012/04/30 18:39 かずき

あえてC#にしてみました!
http://d.hatena.ne.jp/okazuki/20120430/1335753978

# Hello, I enjoy reading all of your article. I wanted to write a little comment to support you. 2018/10/04 16:31 Hello, I enjoy reading all of your article. I want

Hello, I enjoy reading all of your article. I wanted
to write a little comment to support you.

# I believe this is among the so much important info for me. And i am glad studying your article. But wanna statement on some normal things, The site style is ideal, the articles is really great : D. Excellent task, cheers 2018/10/27 19:28 I believe this is among the so much important info

I believe this is among the so much important info for me.
And i am glad studying your article. But wanna statement on some normal things, The
site style is ideal, the articles is really great : D.
Excellent task, cheers

# Hi! I could have sworn I've been to this web site before but after looking at many of the posts I realized it's new to me. Anyhow, I'm certainly delighted I found it and I'll be book-marking it and checking back frequently! 2018/11/18 21:23 Hi! I could have sworn I've been to this web site

Hi! I could have sworn I've been to this web site
before but after looking at many of the posts I realized it's new to me.
Anyhow, I'm certainly delighted I found it and I'll be book-marking it and
checking back frequently!

# Really when someone doesn't know afterward its up to other users that they will help, so here it occurs. 2018/12/07 0:59 Really when someone doesn't know afterward its up

Really when someone doesn't know afterward its up to other users that they will help, so here it occurs.

タイトル  
名前  
URL
コメント