views:

110

answers:

0

I'm writing an app that allows users search and browse catalogs of widgets. My WidgetCatalog class is serialized and deserialized to and from XML files using DataContractSerializer. My app is working now but I think I can make the code a lot more efficient if I started taking advantage of data binding rather then doing everything manually. Here's a stripped down version of my current WidgetCatalog class.

[DataContract(Name = "WidgetCatalog")]
class WidgetCatalog
{
    [DataContract(Name = "Name")]
    public string Name { get; set; }

    [DataContract(Name = "Widgets")]
    public List<Widget> Widgets { get; set; }
}

I had to write a lot of extra code to keep my UI in sync when widgets are added or removed from a catalog, or their internal properties change. I'm pretty inexperienced with data-binding, but I think I want a BindingList<Widget> rather than a plain old List<Widget>. Is this right?

In the past when I had similar needs I found that BindingList<T> does not serialize very well. Or at least the Event Handers between the items and the list are not serialized. I was using XmlSerializer though, and DataContractSerializer may work better.

So I'm thinking of doing something like the code below.

[DataContract(Name = "WidgetCatalog")]
class WidgetCatalog
{
    [DataMember(Name = "Name")]
    public string Name { get; set; }

    [DataMember(Name = "Widgets")]
    private List<Widget> WidgetSerializationList
    {
        get
        {
            return this._widgetBindingList.ToList<Widget>();
        }
        set
        {
            this._widgetBindingList = new BindingList<Widget>(value);
        }
    }

    //these do not get serialized
    private BindingList<Widget> _widgetBindingList;
    public BindingList<Widget> WidgetBindingList
    {
        get
        {
            return this._widgetBindingList;

        }
    }

    public WidgetCatalog()
    {
        this.WidgetSerializationList = new List<Widget>();
    }
}

So I'm serializing a private List<Widget> property, but the GET and SET accessors of the property are reading from, and writing to theBindingList<Widget> property. Will this even work? It seems like there should be a better way to do this.