0

特定の条件に基づいてキャンセルできる ListBox の SelectionChanging イベントが欲しいのですが、これを行う方法はありますか?

ありがとう!

4

2 に答える 2

2

SelectedItem内でこれを行うことで逃げることができるかもしれません

例:

    private string _selectedItem;
    public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            if (value != WhatIWant)
            {
                return;
            }
            _selectedItem = value; 
        }
    }

このように、選択した値が気に入らない場合は、単に保釈するか、他の何かに変更することができます。

DependancyProperitesには、propertyChangedイベントに伝播される前に値を変更できる、かっこいい小さなコールバック(CoerceValueCallback)があります。

public static readonly DependencyProperty SelectedItemProperty =
    DependencyProperty.Register("SelectedItem", typeof(string), typeof(MainWindow), 
    new UIPropertyMetadata(string.Empty,new PropertyChangedCallback(PropertyChanged),
    new CoerceValueCallback(CoerceValue)));

private static void PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{

}

private static object CoerceValue(DependencyObject d, object baseValue)
{
    if (baseValue != WhatIWasExpecting)
    {
        return WhatIWant;
    }
    return baseValue;
}
于 2013-02-19T00:25:40.340 に答える
1

いいえ、ListBox変更をキャンセルできる選択を変更する前に起動するイベントは、ストックWPFコントロールにはありません。

ただし、のSelectionChangedEventArgs間に受け取るクラスはSelectionChangedEvent、古い値(選択解除されている)と新しい値(選択されている)の両方を提供します。そのイベントでロジックを適用し、失敗した場合は選択をリセットすることができます。

このアプローチを採用すると、ユーザーは選択範囲のちらつきに気付くかもしれませんが、AFAIKは、コントロールをサブクラス化して独自のSelectionChangingイベントを実装せずに実行できる最善の方法です。

于 2013-02-19T00:19:19.570 に答える