WPF で MVVM モデルを使用すると、プログラマはコード ビハインドを作成できなくなりますか? コードビハインドを回避すると、多くの複雑さが生じますが、一方で結合が問題になります。それで、何が良いですか?
1 に答える
MVVM モデルは、分離コードの記述を制限しません。
それが促進するのは、ビューがビューモデル(およびモデルのビューモデル)にのみ依存する必要があるということです
したがって、ViewModel を実際に実装するコード ビハインドを記述すると、ViewModel から View への依存関係が作成されます。
関連するものを表示するだけの背後にあるコードは問題ありません
コード ビハインドを使用するときに失うものは、そのコードの簡単な (単体) テストです。
編集
MVVM の世界では、「XAML のみ」という表現が一般的です。私が短くてきびきびした声明が好きな限り、MVVM が解決しようとしている実際の問題とそれを解決しようとする方法から逸れがちです。
View を ViewModel に依存させ、ViewModel を Model に依存させることに固執し、(ユニット) テストの容易性を追求する限り、正しい方向に進んでいます。
編集2
ビュー処理では、イベントは次の 2 つのことだけを行う必要があります。ビュー自体を変更するか、何かが変更されたことをバインディングを使用してビューモデルに通知します。ViewModel の変更を VIEW に通知するには、ViewModel に INotifyPropertyChanged を実装する必要があります。
同様に、ViewModel コマンドを View にバインドすることで、ViewModel は View 内のイベントに応答できます。
WPF ボタンには、使用できる Command プロパティがあります。ボタンがクリックされたときに実行されます。
コントロールに Command プロパティがない場合、または別のイベントが発生したときにコマンドを実行したい場合は、イベントを ICommand の実行に変えるだけです。
Microsoft は既に Blend SDK でその実装を提供しています。この記事から:
... xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity..."
<Slider
<i:Interaction.Triggers>
<i:EventTrigger EventName="ValueChanged">
<i:InvokeCommandAction Command="{Binding MyCommand}"
CommandParameter="{Binding Text, ElementName=textBox}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Slider>