0

リストボックスで使用される動作が添付されています。リストに要素が1つしか含まれていない場合、リストの最初の要素が自動的に選択されます。

リストが変更されたときにリストボックスをフックする唯一の方法は、リストボックスの itemcollections CollectionChanged イベントを使用することです。

private static void ListenToItemsCollectionChange(ListBox listBox)
{
    var collection = (INotifyCollectionChanged)listBox.Items;

    collection.CollectionChanged += (sender, args) => SelectAndSetFocusToFirstElement(listBox);
}

ここでの問題は、イベントのサブスクライブを解除する方法がないことです。これにより、 が複数回呼び出される可能性がありSelectAndSetFocusToFirstelement( )ます。

これに対する通常の解決策は、ラムダを使用しないことです。しかし、最初の要素を選択するために必要なリストボックスが失われます。

これを解決する方法について何か提案はありますか?

完全なコード

4

2 に答える 2

2

ラムダはデリゲートの単なるショートカットであるため、ラムダを次のように書き換えることができます。

NotifyCollectionChangedEventArgs collectionChangedDelegate = (sender, arg) =>
{SelectAndSetFocusToFirstElement(listBox)};

その後、コレクション変更イベントに追加できます

collection.CollectionChanged += collectionChangedDelegate

そして取り除く

collection.CollectionChanged -= collectionChangedDelegate
于 2011-06-24T12:49:28.933 に答える
0

少し混乱しましたが、「しかし、リストボックスが失われます」とはどういう意味ですか?

多分この解決策で十分でしょう

そのような一時変数にイベントハンドラーを保持できます

  EventHandler handler = (a, b) => { }; // You must use aproperiate delegate
    collection.CollectionChanged += handler

購読を解除したい場合は、 -= ハンドラを使用できます

于 2011-06-24T12:46:11.350 に答える