可绑定的ReadOnly列表

时间:2012-11-30 10:39:18

标签: c# winforms

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

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

如果没有公开除Ticket类中的其他添加/删除方法,我如何将此集合添加到DataGridView?

2 个答案:

答案 0 :(得分:1)

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

  • AllowEdit / Add / Remove返回false的成员。
  • 添加/删除抛出InvalidOperationException(或NotSupportedException)的方法 这就是如何确保只读方面。

创建此只读包装后,将其传递给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));
        }
    }
}