1

代わりの ItemsControl (ListBox に非常によく似たもの)、または最後に選択したオブジェクトが「再び」選択されたときに発生する ListBox のイベントはありますか? いくつかの要件のためにコード ビハインドを使用できないため、ソリューションは XAML のみである必要があります。:(

4

2 に答える 2

0

XAMLだけではすべてを達成できませんでした:(。しかし、マウスクリックイベントを使用して達成しました(ユーザーの提案に感謝します)。答えは完璧ではないかもしれませんが、他の人に役立つ可能性があるため、共有することを考えました。

public class CustomListBox : ListBox
{
    private SelectionChangedEventArgs cachedArgs;
    private int state;

    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        this.AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(CustomListBox_MouseDown), true);
        state = 0;
    }

    void CustomListBox_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        if (state == 1) // I don't want to re-raise event if ListBox had raised it already. 
        {
            this.OnSelectionChanged(cachedArgs);
        }
        state = 3;
    }

    protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        state = 1;
        base.OnPreviewMouseLeftButtonDown(e);
    }

    /// <summary>
    /// Responds to a list box selection change by raising a <see cref="E:System.Windows.Controls.Primitives.Selector.SelectionChanged"/> event.
    /// </summary>
    /// <param name="e">Provides data for <see cref="T:System.Windows.Controls.SelectionChangedEventArgs"/>.</param>
    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        cachedArgs = e;
        state = 2;
        base.OnSelectionChanged(e);
        foreach (var item in e.AddedItems)
        {
            Debug.WriteLine(item);
        }
    }
}

私は3つの異なる状態を使用しました。PreviewMouseLeftButtonDownイベントは、常に他の2つのイベントの前に発生するため、状態1になります。SelectionChangedイベントが発生する場合は、Mouse.MouseDownEventの前に発生するため、それぞれ状態2と3になります。

于 2012-05-10T16:02:44.447 に答える
0

マウスクリック イベントが発生したときに、Blend SDK ビヘイビア InvokeMethod を使用して ViewModel でメソッドを実行しようとする場合があります。

この記事は Silverlight に関するものですが、WPF で使用できる同じ動作について説明します

于 2012-05-04T05:43:01.177 に答える