1

TicketLine オブジェクトのコレクションを含む Ticket クラスがあります。このコレクションを DataGridView にバインドしたいのですが、Ticket クラス以外にはアイテムの追加と削除を許可しません。

これまで、BindingList を使用し、TicketLine で INotifyPropertyChanged を実装しましたが、これにより、リスト自体に Add メソッドと Remove メソッドが公開されます。

Ticket クラスのメソッド以外の Add/Remove メソッドを公開せずに、このコレクションを DataGridView にするにはどうすればよいですか?

4

2 に答える 2

1

私が考えることができるのは、ラップされた読み取り/書き込み BindingList へのすべての呼び出しを委任することにより、デコレータ パターンを使用してIBindingListインターフェイスを実装することです。唯一の例外は次のとおりです。

  • false を返すメンバーの編集/追加/削除を許可します。
  • InvalidOperationException (または NotSupportedException) をスローするメソッドを追加/削除します。これにより、読み取り専用の側面が保証されます。

この読み取り専用ラッパーを作成したら、それを DataGridView に渡します。コントラクトを尊重する限り (私はそうすると思います:))、基になるリストの変更を禁止する必要があります。

同じ問題に直面したことがあり、解決策が面倒すぎて実装できませんでした。主な理由は、ジェネリックの損失とそれに必要な作業量です。しかし、それが役立つことを願っています。

于 2012-11-30T11:59:42.553 に答える
0

リストを非表示にして、IEnumerable プロパティのみを公開できます。

public class Ticket : INotifyPropertyChanged
{
    private List<TicketLine> ticketLines;

    public IEnumerable<TicketLine> TicketLines
    {
        get { return ticketLines.AsReadOnly(); }
    }

    public void Add(TicketLine ticketLine)
    {
        ticketLines.Add(ticketLine);
        OnPropertyChanged("TicketLines");
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
于 2012-11-30T13:02:48.117 に答える