我有一个包含 TicketLine 对象集合的 Ticket 类。我想将此集合绑定到 DataGridView 但除了 Ticket 类之外不让任何东西添加和删除项目。
到目前为止,我已经在 TicketLine 中使用了 BindingList 和 implementationet INotifyPropertyChanged,但这会在列表本身上公开 Add 和 Remove 方法。
如何在不公开 Ticket 类中的其他添加/删除方法的情况下将此集合添加到 DataGridView?
我能想到的是通过将所有调用委托给包装的读/写 BindingList 来使用装饰器模式来实现IBindingList接口。唯一的例外是:
创建此只读包装器后,将其传递给 DataGridView。前提是它尊重合同(我认为它确实如此:))它应该不允许修改基础列表。
一旦我遇到同样的问题并且解决方案太麻烦而无法实施。主要是因为泛型的丢失和所需的工作量。不过,我希望它有所帮助。
您可以隐藏列表并仅公开 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));
}
}
}