WPFで私が本当に気に入っていることの1つは、私のビューを宣言的に構築できる範囲です。コードビハインドではなくXAMLを使用します。
CommandParametersがバインディングを受け入れないため、InputBindingsに本当に困惑しています。私のケースはかなり一般的で単純なものだと思いますが、コードビハインドに頼らずにそれを行う方法がわかりません。検討:
<ListBox Name="casingsListBox" ItemsSource="{Binding Path=Casings}" SelectedValuePath="Id">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Title}"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.InputBindings>
<!-- Doesn't work: -->
<MouseBinding Gesture="LeftDoubleClick"
Command="ApplicationCommands.Open"
CommandParameter="{Binding RelativeSource={RelativeSource Self} Path=SelectedValue}"/>
</ListBox.InputBindings>
</ListBox>
MouseBindingのCommandParameterのバインディング式が不正であるため、これは機能しません。
自分に問いかけます。選択した値に到達できない場合、リストボックスにマウスクリックジェスチャを追加する意味は何ですか?
もちろん、これはコードビハインドイベントハンドラーを使用するか、コマンドコンシューマーにコマンドソースからIDを抽出させることで簡単に解決できますが、これが望ましくない理由はいくつかあります。コードビハインドコードの群れがそもそもWPFの目的(の一部)を打ち負かすという事実は別として、ExpressionBlendで作業するUIデザイナーの権限が弱くなります。そして、くそー、私のコマンドパラメータはIDであり、UI要素ではありません!!
主観的:しばらくの間SOを閲覧してきましたが、WPF関連の質問に表示されるコードの量に驚いています。WPFが表すはずのUI構築の新しい見方を利用しようとするのではなく、開発者が古い習慣に固執し、コードビハインドファイルを喜んでハックしているような気がします。どう思いますか?
しかし、最も重要なのは、この一見些細な問題のコードフリーの回避策を誰かに教えてもらえるかということです。できれば、このようなひどいハックなしで。