5

アイテムのリストを含むユーザーコントロールがあり、currentIndexが変更されたときにイベントを発生させます。また、変更された場合は、他の2つのメソッドを呼び出して、コントロールの外観を確認および変更する必要があります(画像の変更とブロック/ブロック解除)いくつかのボタン)。

私が知りたいのは、主にすでに機能しているため好奇心からですが、これら2つのメソッドを呼び出す方が適切なのはいつですか。

CurrentIndexプロパティ自体の中でそれらを呼び出す必要がありますか?内でそれらを呼び出す必要がありOnCurrentIndexChanged(...)ますか?クラス内でイベントを処理し、そこで実行する必要がありますか?

4

3 に答える 3

6

protected virtual標準のイベント生成パターンを実装し、派生クラスがメソッドをオーバーライドしてイベントの生成や処理を変更できるようにOnCurrentIndexChanged を作成したと仮定します。

残念ながら、それには茶葉を読む必要がありますが、なぜメソッドをオーバーライドしたいのでしょうか? さらに深刻なことに、メソッドをオーバーライドすると、制御が壊れる可能性があります。コードをよく知らない人にとっては、推測するのが非常に難しく、あなたにとっても簡単ではありません。ここで適用する原則は、.NET フレームワーク コードでも使用されますが、できる限り少なくすることです。イベントを発生させるだけで、他には何もありません。base.OnCurrentIndexChanged を呼び出さないなど、派生クラスがばかげた、しかし完全に一般的なことを行った場合の破損の可能性を最小限に抑えます。

コントロールの動作は、UserControl の実装の詳細です。そのため、CurrentIndex プロパティ セッターでそれらのプロパティを変更してから、OnCurrentIndexChanged() を呼び出します。クラスから派生した人は、必要に応じてその動作をオーバーライドできます。OnCurrentIndexChanged() メソッドを呼び出すのを忘れても問題はありません。ただし、制御変数を非公開ではなく保護する必要があることに注意してください。そのため、必要に応じて動作をオーバーライドできます。

また、これがあまりにも気味が悪い場合は、仮想メソッドをまったく使用しないことを躊躇しないでください。あなたのコントロールで何十万ものプログラマーに対応しなければならないことは一般的ではありません:)

于 2012-04-16T18:55:45.953 に答える
2

ユーザー コントロールには、選択した項目を表すプロパティがあります。次に、オブジェクトのセッター中に、イベント メソッドを発生させて、ユーザー コントロールを変更します。そうすれば、将来、さらにリスナーを追加する必要がある場合は、setter メソッドに別のハンドラーを追加するだけで済みます。これは MVVM アプリケーションではかなり一般的であり、メンテナンスも容易です。

于 2012-04-12T19:05:10.370 に答える
1

UserControlはListControlとして機能するため、2つのイベントと2つのプロパティを実装する必要があります。

public event System.EventHandler SelectedIndexChanged;
public event System.EventHandler SelectionChangeCommitted;

public int SelectedIndex {
    get;
    set;
}

public T SelectedItem { // Where T is whatever your type is
    get;
    set;
}

SelectedIndexChanged選択したインデックスが変更されたときに常にトリガーする必要があるアクションには、常に使用する必要があります。ユーザーが物理的に選択を変更した場合にのみトリガーするSelectionChangeCommitted必要があります。2つの間の分離は重要な違いであり、.NETのほとんどのコントロールはこのパターンに従います(例:ComboBox)が、イベントに同じ名前を使用しない場合があります。

そうは言っても、プロパティを変更する必要のあるコントロールも同じユーザーコントロール内にある場合は、もちろん、適切なイベントのユーザーコントロールコード内でそれを処理する必要があります。それ以外の場合は、イベントをサブスクライブしてそこで作業を行うことにより、ユーザーコントロール(フォームや別のユーザーコントロールなど)を実装するユーザーに対してコードを孤立させる必要があります。

順序は実際には要件によって異なりますが、常に上げるSelectedIndexChanged必要があり(ただし、奇妙な動作を引き起こすため、変更ごとに1回だけ上げる必要があります) 、ユーザーのみが上げる必要があります(たとえば、SelectedIndexまたはSelectedItemの設定)。SelectionChangeCommitted

経験則として、ユーザーが気付く前に内部的なことが発生しなければならない場合は、最初にSelectedIndexChangedを呼び出し、次にSelectionChangeCommittedを呼び出します。それが問題ではない場合は、または。後で順序を変更すると、コントロールを実装する人に重大な変更が生じる可能性があるため、確実な決定を下してください。

2つの違いは、SelectedIndexとSelectedItemは、リストを内部的にクリアしたり、新しいアイテムを追加したりするなどして更新されますが、必ずしも両方のイベントが発生する物理的なユーザーアクションであるとは限りません。

お役に立てれば。

于 2012-04-19T13:59:17.803 に答える