2

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構築の新しい見方を利用しようとするのではなく、開発者が古い習慣に固執し、コードビハインドファイルを喜んでハックしているような気がします。どう思いますか?

しかし、最も重要なのは、この一見些細な問題のコードフリーの回避策を誰かに教えてもらえるかということです。できれば、このようなひどいハックなしで。

4

2 に答える 2

3

'sをデータバインドできるようにするマークアップ拡張機能を作成しました:InputBindingCommand

<KeyBinding Modifiers="Control" Key="E" Command="{input:CommandBinding EditCommand}"/>

をバインドしたいので状況は少し異なりCommandParameterますが、おそらく私のコードをあなたのケースに合うように適応させることができます。このコードはプライベートリフレクションを使用していることに注意してください。これは完全な信頼でのみ機能し、WPFの新しいバージョンで壊れることがあります(実際にWPF 4.0で壊れています...必要に応じて変更されたバージョンを投稿できます)。

もう1つのオプションは、 MVVMツールキットにあるCommandReferenceクラスを使用することです。

<Window.Resources>
    <c:CommandReference x:Key="EditCommandReference" Command="{Binding EditCommand}"/>
</Window.Resources>

...

<KeyBinding Modifiers="Control" Key="E" Command="{StaticResource EditCommandReference}"/>

繰り返しますが、これはCommandプロパティをバインドするためのものですが、おそらくバインドするように適合させることができCommandParameterます...

于 2009-09-07T19:04:45.640 に答える
1

この問題を解決する新しい方法は、式トリガー/アクションを使用することです。これにより、カスタムアクション(コマンドの起動など)を実行する任意のコントロールにキーボードショートカットを設定できます。

于 2009-09-06T20:23:26.380 に答える