3

カスタム オブジェクト (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" を追加します。

バインドすると、DatagridViewProperty1 と VirtualProperty2 が 2 つの列として表示され、セルの値は期待どおりです。

次に、Property1 の値を次のいずれかで変更すると、

  1. データグリッドビューでプロパティ 1 セルを直接更新する
  2. datagridview の VirtualProperty2 セルを直接更新する
  3. コードを介して MCO.Property1 インスタンスを更新するフォームのボタンをクリックする

Property1 セルは期待どおりに更新されます。ただし、VirtualProperty2 は条件 2 によってのみ変更されます。

手順 1 または 3 の後に VirtualProperty2 のセルをクリックすると、更新されます。(セルをクリックすると、PropertyDescriptor でゲッターを呼び出すイベントが発生する必要があるため)

VirtualProperty1 が Property1 にマッピングされているため、MCO の Propery1 が PropertyChanged イベントを発生させたときに VirtualProperty1 の PropertyDescriptor が PropertyChanged イベントに応答する必要があります。

アイデア?

4

1 に答える 1