バックグラウンドスレッドでUI要素を作るともっと問題は深刻かもしれない。(WPF)

お久しぶりです。

ぐらばくさん(@Grabacr07)のブログ記事、バックグラウンド スレッドで UI 要素を作るとメモリリークする (WPF) | grabacr.nét が個人的に話題です。

この問題について、もうちょっと詳しく調べてみました。

続きを読む

Twitterでこの先生きのこるには – ふぁぼ爆撃の傾向と対策

.    _,,…,_
.  /_~,,..::: ~”‘ヽ
. (,,”ヾ  ii /^’,)
.    :i    i”
.    | (,,゚Д゚) < この記事は mikutter アドベントカレンダー 21日目の記事です。
.    |(ノ  |)
.    |    |
.    ヽ _ノ
.     U”U

今年も年の瀬が近づき、寒さが一層厳しくなってまいりました。それはさておき。

mikutter アドベントカレンダーについて名乗りを挙げたのですが、至らない私はなんとmikutterを使ったことがありません。仕方ないのでとしぁ氏に味噌カツをおごった時の話でもしようかと思ってたのですが、それはまたの機会に。

今回は、ふぁぼ爆撃のお話です。

続きを読む

Windows Phoneにおける高速なシリアライズについて。

多数のオブジェクトや複雑なオブジェクトをシリアライズ・デシリアライズする際は、パフォーマンスがネックとなります。デシリアライズ処理が速く終わればそれだけ速く操作可能になり、より良好なUXを提供できます。シリアライズ処理が長引くと10秒ルールに引っかかる恐れがあります。というわけで、WPで利用可能な(比較的)高速なシリアライズ手法について。

ただし、今回は時間の計測を行っていません、データどこかにやってしまった。。

see also: neue cc – .NET(C#)におけるシリアライザのパフォーマンス比較 http://neue.cc/2010/05/29_261.html
続きを読む

How to: Data Binding for ListPicker.SelectedItems

ListPicker.SelectedItems is a “IList” Property, so you must prepare the property typed “IList”, in your ViewModel.

Here is sample implementation::

in XAML:

        <toolkit:ListPicker Name="AccountListPicker"
                            Grid.ColumnSpan="2"
                            Margin="12,8"
                            ItemsSource="{Binding AuthInfos,
                                                  Mode=OneWay}"
                            SelectedItems="{Binding Selected,
                                                    Mode=TwoWay}"
                            SelectionMode="Multiple"
                            d:LayoutOverrides="Height" />

in ViewModel:

        private ObservableCollection _selected = new ObservableCollection();
        public IList Selected
        {
            get { return _selected; }
            set
            {
                if (_selected == value) return;
                _selected = new ObservableCollection();
                value.OfType().ForEach(a => _selected.Add(a));
                RaisePropertyChanged(() => Selected);
            }
        }

Additional: You should make sure that Collection have freezed which is binding in ItemsSource.

bad sample:

public IEnumerable ItemsSource
{
	// New instances are created every calling ItemsSource.
	get { return SomeModel.Query(); }
}

good sample:

private IEnumerable _itemsSource = SomeModel.Query().ToArray();
public IEnumerable ItemsSource
{
	get { return _itemsSource; }
}

Have fun with Silverlight WP! XD

MVVMでVMからCodeBehindに通知するとき

覚え書き。

ViewModelからCodeBehindへ通知するとき、つまりは通常バインドで解決されるようなルートにおいてCodeBehindのメソッドを呼び出したいとき。

VM(メッセージをRaise)→[メッセージ]→View(メッセージトリガ)→[CallMethodAction]→CodeBehind

とすれば動いてくれる。

単にCodeBehindにメソッド定義しておけばそれを呼べるので一番シンプル?

何も知らない人への”MVVMって何”?

WinForms開発経験が存分にある人だとそこそこ理解してもらえるんだろうけど、そうじゃないと辛いかなぁということで。

流石にオブジェクト指向の基本的な知識はあってほしい。

GUIについて。

GUIは、一般的にコンストラクタで各種部品をインスタンス化していくことで作ります。
部品に対する操作(ボタンをクリックしたり、チェックボックスのチェックを付けたり)などは、イベントとしてコールされます。このイベントに反応して処理することによって、いろいろな処理を行います。

01

こんな模式図。

古典的なUIとドメインロジックの分離。

さすがにこれでは何がなんだか分からないので、せめてUIを構成するソースコードとUIからの反応に対するソースコードを分けようと、先の偉い人は考えた訳です。

02

分けたんですが、同じクラス内でソースコードを分離したりなどのゆるーい区切りしかありませんでした。

MVCパターン。

あんまり変わってないじゃんか!と怒った先の偉いひとは、もっと明確に分離しようと考えました。MVC(Model-View-Controller)パターンの誕生です。

03

Modelでデータの保持、ViewでUIへの反映、Controllerでその調停、そんな感じで役割を受け持つことですっきりしました。

じゃあ、MVVMパターンは?

04

見てわかるとおり、MVCパターンとあんまり変わりません。

MVVMパターンは”WPF”というアプリケーション開発のベースとなる機構に沿って作られた、MVCパターンの変化球のようなものです。どう違うのでしょう。

05

これは一例ですが、ちょっとだけ変化したのが分かると思います。

青い矢印が入りました。これは、WPFが受け持ってくれる部分です。この部分はある作法に則って作ると、WPFが自動で制御してくれます。また、操作が直接ViewModelに行くようになりました。これもいろいろな仕掛けのおかげです。

と、小難しいことを書いていますが、要するに「より見通し良くソフトを作りたい!」という欲求の結果で生まれたものです。より綺麗に、やりたいことだけを見据えることができるようになります。

よりMVVMについて専門的な知識をお求めの場合は、

[MVVMパターンとは? – わんくま同盟東京勉強会 #60 セッション資料] – http://ugaya40.net/mvvm/what_is_mvvm.html

など参考になると思います。

こんな感じ?