public override void SetValue(object component, object value)
        {
            FinancialData trade = (FinancialData)component;

            if (null != trade)
            {
                trade.SetProp(Key, value);
            }
            OnValueChanged(component, EventArgs.Empty);
        }
        public override object GetValue(object component)
        {
            object        retVal = null;
            FinancialData trade  = (FinancialData)component;

            if (null != trade)
            {
                retVal = trade.GetProp(Key);
            }
            return(retVal);
        }
        public Window1()
        {
            InitializeComponent();

            // DataTable as source
            var dt = new System.Data.DataTable();
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Serial", typeof(int));
            dt.Columns.Add("Price", typeof(decimal));
            dt.Columns.Add("Current", typeof(bool));
            var rnd = new Random();
            for (int r = 0; r < 100; r++)
            {
                dt.Rows.Add(
                    string.Format("item {0}", r),
                    r,
                    new decimal(rnd.NextDouble() * 10000 + 1000),
                    rnd.NextDouble() < 0.8);
            }
            var dtView = new ListCollectionView(dt.DefaultView);

            // CustomTypeDescriptor as source
            var fd = FinancialData.GetFinancialData();
            var fdView = new ListCollectionView(fd);

            // bind c1 grids
            _flexDataTable.ItemsSource = dtView;
            _flexFinancial.ItemsSource = fdView;

            // save main view to customize in event handlers
            _mainView = fdView;
            _mainView.CollectionChanged += _mainView_CollectionChanged;

            // configure search box
            _search.View = _mainView;
            var ctd = _mainView.CurrentItem as ICustomTypeDescriptor;
            foreach (PropertyDescriptor pd in ctd.GetProperties())
            {
                if (pd.Name == "Symbol" || pd.Name == "Name")
                {
                    _search.FilterProperties.Add(pd);
                }
            }

            // customize group row content
            _flexFinancial.GroupHeaderConverter = new SymbolGroupHeaderConverter();
        }
        // get a default list of financial items
        public static FinancialDataList GetFinancialData()
        {
            var list = new FinancialDataList();
            var rnd  = new Random(0);
            var asm  = Assembly.GetExecutingAssembly();

            foreach (string resName in asm.GetManifestResourceNames())
            {
                if (resName.EndsWith("data.zip"))
                {
                    var zip = new C1.C1Zip.C1ZipFile(asm.GetManifestResourceStream(resName));
                    using (var sr = new StreamReader(zip.Entries["StockSymbols.txt"].OpenReader()))
                    {
                        while (!sr.EndOfStream)
                        {
                            var sn = sr.ReadLine().Split('\t');
                            if (sn.Length > 1 && sn[0].Trim().Length > 0)
                            {
                                var data = new FinancialData();
                                data.SetProp("Symbol", sn[0]);
                                data.SetProp("Name", sn[1]);
                                data.SetProp("Bid", rnd.Next(1, 1000));
                                data.SetProp("Ask", (decimal)rnd.NextDouble());
                                data.SetProp("LastSale", (decimal)rnd.NextDouble());
                                data.SetProp("BidSize", rnd.Next(10, 500));
                                data.SetProp("AskSize", rnd.Next(10, 500));
                                data.SetProp("LastSize", rnd.Next(10, 500));
                                data.SetProp("Volume", rnd.Next(10000, 20000));
                                data.SetProp("QuoteTime", DateTime.Now);
                                data.SetProp("TradeTime", DateTime.Now);
                                list.Add(data);
                                FinancialData.BuildPropertyDescriptorCollection(data._propBag, false);
                            }
                        }
                    }
                    list.AutoUpdate = true;
                    return(list);
                }
            }
            throw new Exception("Can't find 'data.zip' embedded resource.");
        }