事実上すべてのクラスにデータバインドできます。たとえば、名前と年齢を持つ人物など、いくつかのプロパティを持つ非常に単純なクラスを作成するとします。私が話しているのは、何も凝っていない単純な単純なクラスです。
Person のインスタンスを作成すると、それを使用していくつかのことができます。Windows フォームで作業していると仮定しますが、これは主に他のフレームワークに当てはまります。 - そのプロパティをコントロールのプロパティにバインドできます。- データグリッド、リストなどにバインドできます。前者の場合、どのプロパティをどの列にバインドするかのマッピングを設定できます。後者では、どのプロパティがリストに表示され、どのプロパティがユーザーによって選択された値になります。- さらに良いことに、それを bindingSource にバインドできます。
単一のインスタンスをグリッドまたはリストにバインドすることはあまり役に立ちません。そのため、通常はインスタンスのリストを作成し、それらをグリッドにバインドします。さらに正しいのは、リストをバインディングソースにバインドし、グリッドもバインディングソースにバインドすることです。
これらすべてを行う方法については、こちらの良い記事を参照してください。
さて、あなたが言及したすべてのインターフェースについて、それらはすべて、データバインディングの経験により多くの価値を追加するだけです. それらのいくつかについて話しましょう。
INotifyPropertyChanged。Person は、このインターフェイスを実装していない場合、他のオブジェクトよりも「データバインド可能」ではありません。ただし、 Person のインスタンスができないことは、プロパティがバインドされているコントロールに、後者が変更されたことを通知することです。これを試してください: Person インスタンスの Name プロパティを TextBox の Text プロパティにバインドします。クリックするとそのインスタンスの Name の値が変わるボタンを作成します。ボタンをクリックした後、TextBox が更新されないことがわかります。一方、INotifyPropertyChanged を実装し、Name プロパティのセッターにインターフェイスで定義された PropertyChangedEvent を発生させると、経験を繰り返すと、テキスト ボックスが自動的に更新されることがわかります。
IEnumerable。1 人の人物ではなく、一連の人物にデータバインドしたくない場合は、人物のリストを作成し、そのリストにデータバインドすることができます。たとえば、List lst = new List(); を見てみましょう。datagrid、bindingSource などのデータバインディング コントロールは、lst 自体のプロパティではなく、Person のセットにバインドする必要があることをどのように認識しますか? これは、List が IEnumerable を実装しているためです。したがって、これらのコントロールを IEnumerable を実装するインスタンスにバインドすると、コントロールは、リストのプロパティではなく、リストが参照するインスタンスにバインドすることを認識します。リストに含まれるオブジェクトの種類をどうやって知るのでしょうか? より一般的になり、任意のタイプの IEnumerable 実装をサポートするために、リストの最初の要素のタイプをチェックし、他のすべての要素が等しいと仮定します。
IBindingList: Person が IPropertyChanged を実装している場合でも、Person のインスタンスを List にグループ化し、そのリストをコントロールにバインドし、コードによっていずれかのインスタンスのプロパティの値を変更すると、画面に何も表示されません。これは、Person がバインディング ソースではなくリストを通知しているためです。ただし、リストはデータバインディング用に作成されていないため、イベントをリッスンしたり、コントロールに伝達したりしません。BindingList のように IBindingList を実装するリストは、コンテンツの PropertyChangedEvent イベントをリッスンし、それらをデータ バインド コントロールに伝達することによって、より優れたデータ バインディング サポートを正確に提供します。
オブジェクトがデータバインド可能かどうかを判断する方法を提供していないことを残念に思います。事実上すべてのオブジェクトがデータバインド可能であるためです。ただし、さまざまなレベルのデータバインディング サポート (INotifyPropertyChanged および IBindingList) を判断する方法を提供できたことを願っています。リフレクションを介してこれらをチェックする方法を知っていると思います。