各コントロール用のViewModelを用意しよう。

MVVMパターンでは、VからVMのプロパティに対してデータバインディングを行う。
コントロールの数だけ、そしてバインディングするプロパティの数だけ、ViewModel側にもそのプロパティを用意する必要がある。TextBlockであれば、Textプロパティのみでも良い。でも、TextBoxだとそれ(Textプロパティ)だけというのは、開発上あまりない。
・IsReadOnlyプロパティとバインディングしたい。
・IsEnabledも必要があればバインディングしたい。
・Focus系とも連携させたい。
・エラーテンプレートとも連動したくなる時があるかもしれない。
ViewModel側でやりたいことはいくらでも出てくる。
画面用ViewModelのプロパティで、TextBoxとデータバインディングさせるとどうなるだろう?

<Window x:Class="TawamureDays.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TawamureDays" Height="300" Width="300">
<StackPanel>
<TextBox MinWidth="100"
Name="Text1"
IsReadOnly="{Binding IsText1ReadOnly}"
IsEnabled="{Binding IsText1Enabled}"
/>
</StackPanel>
</Window>

ViewModel側には、IsTextReadOnlyとIsTextEnabledプロパティの2つを用意する必要がある。
これに
ViewModel側から特定コントロールにフォーカスを当てる(弐)。
で書いたような添付プロパティも使おうとすると、

<Window x:Class="TawamureDays.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TawamureDays"
Title="TawamureDays" Height="300" Width="300">
<StackPanel>
<TextBox MinWidth="100"
Name="Text1"
IsReadOnly="{Binding IsText1ReadOnly}"
IsEnabled="{Binding IsText1Enabled}"
local:FrameworkElementBehavior.IsFocused="{Binding IsText1Focus}"
/>
</StackPanel>
</Window>
と、1つのTextBoxにつき3つのプロパティを用意する必要がある。
仮に1画面で、n個のTextBoxが必要なら、3n個のプロパティを用意する事になる。
n=10なら、30個…。それも似たようなのが一杯。そして、それらの変更を監視しよう(PropertyChangedのイベントをフックしよう)と思うなら、switch文に各々のcaseを書いて…。
キー!めんどくせ!
となってしまう。まあ、実際作ってみて、これは、毎度毎度似たようなプロパティをちくちく用意するのは大変というのを実感した。
あと、バインディングって、ミスってもそうそう落ちはしないし、ビルドエラーにもならない。でも、ほうっておくと、確実にパフォーマンスに影響する。
沈黙の臓器か!と言いたくなる。
というわけで、ウィンドウ用のViewModelを用意すると共に、各コントロールについてのViewModelも用意した方が良いという結論に至った。全部用意するだけの時間はなかったので、高頻度で使うコントロールについてViewModelを用意した。
用意したコントロール。

TextBox
DatePicker
ComboBox
DataGrid
ProgressBar


用意しなかったコントロール。

ListBox:あまり使わなかった。ListViewもDataGridで代用。
CheckBox:IsChekcedくらいとしかバインディングしないので作っていない。
Button:Commandくらいとしかバインディングしないので(ry。


ウィンドウ用ViewModelを実装→各コントロール用ViewModelを実装を経て、ようやく画面開発に入れた感じかな。
当然、一番実装に苦労したのは、DataGrid用のViewModelだけどね。
理由もわからず動かないとか、1回だけ動いて2度目はないとか…。苦労したなぁ(遠い目)。
まあ、別に1人で苦労したわけではなく、チーム全員で苦労したんだけど。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m