private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            try
            {
                if (e.NewItems != null && e.Action == NotifyCollectionChangedAction.Add)
                {
                    foreach (RevitItemMapper item in e.NewItems)
                    {
                        int  index     = rvtSheetData.ItemMaps.IndexOf(item);
                        Guid itemMapId = Guid.NewGuid();
                        this.RvtSheetData.ItemMaps[index].ItemId = itemMapId;

                        bool dbUpdated = SheetDataWriter.ChangeReplaceItem(rvtSheetData.ItemMaps[index], CommandType.INSERT);
                    }
                }
                if (e.OldItems != null && e.Action == NotifyCollectionChangedAction.Remove)
                {
                    foreach (RevitItemMapper item in e.OldItems)
                    {
                        bool dbUpdated = SheetDataWriter.ChangeReplaceItem(item, CommandType.DELETE);
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
        }
        private void dataGridItem_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            try
            {
                DataGridRow row = e.Row;
                if (null != row)
                {
                    RevitItemMapper item         = row.Item as RevitItemMapper;
                    string          propertyName = e.Column.Header.ToString();

                    switch (propertyName)
                    {
                    case "Source Value":
                        TextBox sourceTextBox = e.EditingElement as TextBox;
                        if (null != sourceTextBox)
                        {
                            var itemFound = from itemMap in rvtSheetData.ItemMaps where itemMap.SourceValue == sourceTextBox.Text && itemMap.ItemType == item.ItemType && itemMap.ItemId != item.ItemId select item;
                            if (itemFound.Count() > 0)
                            {
                                MessageBoxResult msgResult = MessageBox.Show("[" + sourceTextBox.Text + "] Item already exists in the list. \nPlease enter a different value.", "Existing Value", MessageBoxButton.OK, MessageBoxImage.Information);
                                if (msgResult == MessageBoxResult.OK)
                                {
                                    e.Cancel = true;
                                }
                            }
                            else
                            {
                                item.SourceValue = sourceTextBox.Text;
                                bool dbUpdated = SheetDataWriter.ChangeReplaceItem(item, CommandType.UPDATE);
                            }
                        }
                        break;

                    case "Target Value":
                        TextBox targetTextBox = e.EditingElement as TextBox;
                        if (null != targetTextBox)
                        {
                            item.TargetValue = targetTextBox.Text;
                            bool dbUpdated = SheetDataWriter.ChangeReplaceItem(item, CommandType.UPDATE);
                        }
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
        }
        private void buttonAddItem_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (null != comboBoxType.SelectedItem && null != comboBoxParameter.SelectedItem)
                {
                    ItemMap itemMap   = comboBoxType.SelectedItem as ItemMap;
                    string  parameter = comboBoxParameter.SelectedItem.ToString();

                    if (null != itemMap && !string.IsNullOrEmpty(parameter))
                    {
                        string sampleSourceName = "";
                        double suffix           = 0;
                        if (dataGridItem.Items.Count > 0)
                        {
                            RevitItemMapper lastItem = dataGridItem.Items[dataGridItem.Items.Count - 1] as RevitItemMapper;
                            sampleSourceName = lastItem.SourceValue.ToString();

                            if (DataGridUtils.GetSuffix(sampleSourceName, out suffix))
                            {
                                sampleSourceName = sampleSourceName.Replace(suffix.ToString(), (suffix + 1).ToString());
                            }
                            else
                            {
                                sampleSourceName += " " + (suffix + 1).ToString();
                            }
                        }

                        if (string.IsNullOrEmpty(sampleSourceName))
                        {
                            sampleSourceName = "New Item 1";
                        }

                        RevitItemMapper itemMapper = new RevitItemMapper(Guid.NewGuid(), itemMap.ItemMapType, parameter, sampleSourceName, "");
                        this.RvtSheetData.ItemMaps.Add(itemMapper);
                        bool dbUpdated = SheetDataWriter.ChangeReplaceItem(itemMapper, CommandType.INSERT);
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
        }
        private void buttonDeleteItem_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (null != dataGridItem.SelectedCells)
                {
                    var selectedItems = from cell in dataGridItem.SelectedCells select cell.Item;
                    if (selectedItems.Count() > 0)
                    {
                        List <RevitItemMapper> items = selectedItems.Cast <RevitItemMapper>().Distinct().ToList();

                        foreach (RevitItemMapper item in items)
                        {
                            this.RvtSheetData.ItemMaps.Remove(item);
                            bool dbUpdated = SheetDataWriter.ChangeReplaceItem(item, CommandType.DELETE);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = ex.Message;
            }
        }