1

我有一个包含 TicketLine 对象集合的 Ticket 类。我想将此集合绑定到 DataGridView 但除了 Ticket 类之外不让任何东西添加和删除项目。

到目前为止,我已经在 TicketLine 中使用了 BindingList 和 implementationet INotifyPropertyChanged,但这会在列表本身上公开 Add 和 Remove 方法。

如何在不公开 Ticket 类中的其他添加/删除方法的情况下将此集合添加到 DataGridView?

4

2 回答 2

1

我能想到的是通过将所有调用委托给包装的读/写 BindingList 来使用装饰器模式来实现IBindingList接口。唯一的例外是:

  • AllowEdit/Add/Remove 返回 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 回答