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