カスタム オブジェクト (MCO)DataGridView
へのバインドを使用する単純な Windows フォーム アプリケーションがあります。BindingList<>
また、MCO の既定のプロパティ以外の DataGridView に関する詳細情報を提供する目的で、MCO の型に対して登録するカスタム TypeDescriptor とカスタム PropertyDescriptor を実装しました。カスタム TypeDescriptor の PropertyDescriptorCollection は、親 (MCO の既定の PropertyDescriptor) と 1 つのカスタム PropertyDescriptor から PropertyDescriptor を返します。
すべて問題なくDataGridView
、DataSource にバインドすると、表示される列はカスタム TypeDescriptor から返された列に対応します。
また、MCO プロパティが変更されたときに datagridview が更新されるように、MCO に INotifyPropertyChanged を実装しました。しかし、3 日間インターネットを精査し、あらゆる種類のテスト コードを実行した後、カスタム PropertyDescriptor を INotifyPropertyChanged イベントにも参加させる方法を理解するのに苦労しています。
例として、MCO は次のようになります。
Public Class MyCustomObject : INotifyPropertyChanged
{
public int Property1 { get; set;}
//typical INotifyPropertyChanged implementation
}
そして、PropertyDescriptor のゲッターとセッターを介して Property1 にマップされる TypeDescriptor.AddProvider() を介してカスタム PropertyDescriptor "VirtualProperty2" を追加します。
バインドすると、DatagridView
Property1 と VirtualProperty2 が 2 つの列として表示され、セルの値は期待どおりです。
次に、Property1 の値を次のいずれかで変更すると、
- データグリッドビューでプロパティ 1 セルを直接更新する
- datagridview の VirtualProperty2 セルを直接更新する
- コードを介して MCO.Property1 インスタンスを更新するフォームのボタンをクリックする
Property1 セルは期待どおりに更新されます。ただし、VirtualProperty2 は条件 2 によってのみ変更されます。
手順 1 または 3 の後に VirtualProperty2 のセルをクリックすると、更新されます。(セルをクリックすると、PropertyDescriptor でゲッターを呼び出すイベントが発生する必要があるため)
VirtualProperty1 が Property1 にマッピングされているため、MCO の Propery1 が PropertyChanged イベントを発生させたときに VirtualProperty1 の PropertyDescriptor が PropertyChanged イベントに応答する必要があります。
アイデア?