0

バックグラウンド

を含む を含むカスタム コントロールがPopupあります。ListBox

要件

ユーザーがアイテムを選択したときに、ポップアップを閉じて、選択したアイテムでいくつかのロジックを実行する必要があります。次の場合にユーザーが項目を選択します。

  1. 彼はマウスで項目をクリックします。
  2. 彼はキーボード ナビゲーション (上/下キー) で項目を選択し、Enter をクリックします。

問題

上記のすべてを実装しましたが、ロジックを実行するためにリッスンするイベントに問題があります。

イベントでロジックを実行するSelectionChangedと、ユーザーが選択したアイテムをクリックしてもロジックが起動しないため、最初のシナリオがありません。でロジックを実行するPreviewMouseLeftButtonDownと、選択が変更される前に起動するため、ユーザーが何を選択したかわかりません。これが両方を使用できない理由でもあります。

ListBoxItemこれを行うためにイベントをリッスンすることを考えました( WPF の ListBox の項目でマウス クリックをキャプチャする方法は? ) か、暗黙的なスタイルからコマンドを起動するListBoxItem(スタイルで WPF 相互作用がトリガーされ、View Model でコマンドを呼び出す) が、彼らは私のために働きませんでした。

私が思いついた最良のアイデアは、動作またはアクションを介してある種の「選択後」MouseButtonDown イベントを作成することですが、その方法、またはこれが正しい方法であるかどうかはわかりません。

そのようなものを作成する方法はありますか?または、これに対するより良い解決策はありますか?

4

1 に答える 1

1

答えはBindListBox.SelectedItemプロパティとPreviewKeyDownコントロールのイベントを処理することです。このようにして、どのアイテムが選択されているか、いつEnterキーが押されたかを常に知ることができます:

public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.
    Register("SelectedItem", typeof(YourDataType), typeof(YourControl), 
    new UIPropertyMetadata(null, OnSelectedItemPropertyChanged));

public YourDataType SelectedItem 
{
    get { return (YourDataType)GetValue(SelectedItemProperty); }
    set { SetValue(SelectedItemProperty, value); }
}

private static void OnSelectedItemPropertyChanged(DependencyObject sender, 
    DependencyPropertyChangedEventArgs e)
{
    // User has selected an item
}
...
private void Control_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter || e.Key == Key.Return)
    {
        // User pressed Enter... do something with SelectedItem property here
    }
}

更新 >>>

わかりました、私はあなたの問題をもう少しよく理解していると思います. 最も簡単な解決策は、要件を少し変更できる場合です。

  1. 項目は、マウスまたはキーボードの上下キーで選択されます
  2. キーでアイテムを選ぶEnter

そうすれば、ユーザーが選択したときに、選択されたアイテムを常に知ることができます。ただし、それができない場合は、PreviewMouseLeftButtonUp代わりにPreviewMouseLeftButtonDownイベントを処理できますか? 100%確実ではありませんが、選択が行われたに発生すると思います。

于 2013-10-27T14:02:56.803 に答える