// If a DataGridCollectionViewBase is used, get the ItemProperties it defines to be able to retreive DataGridForeignKeyDescription for each of them
        // to get the auto-detected ForeignKey ItemsSource (if any).
        // If a DataGridCollectionViewBase is not used, the ItemsSource must be manually specified on each Column in order to correctly display/edit the Data
        internal static void UpdateColumnsForeignKeyConfigurationsFromDataGridCollectionView(
            ObservableColumnCollection columns,
            DataGridItemPropertyCollection itemProperties,
            bool autoCreateForeignKeyConfigurations)
        {
            if (itemProperties == null)
            {
                return;
            }

            foreach (var itemProperty in itemProperties)
            {
                var description = itemProperty.ForeignKeyDescription;
                if (description != null)
                {
                    var columnName = PropertyRouteParser.Parse(itemProperty);
                    var column     = (columnName != null) ? columns[columnName] as Column : null;

                    if (column != null)
                    {
                        ForeignKeyConfiguration.SynchronizeForeignKeyConfigurationFromForeignKeyDescription(column, description, autoCreateForeignKeyConfigurations);
                    }
                }

                if (itemProperty.ItemPropertiesInternal != null)
                {
                    ForeignKeyConfiguration.UpdateColumnsForeignKeyConfigurationsFromDataGridCollectionView(
                        columns,
                        itemProperty.ItemPropertiesInternal,
                        autoCreateForeignKeyConfigurations);
                }
            }
        }
        internal override void OnEditCanceled(DataGridItemEventArgs e)
        {
            var item        = e.Item;
            var pageManager = this.RootGroup.GetVirtualPageManager();

            // Compare cached values with current values.  If they are the same, we can clear the old values which in turn will
            // make the item non dirty.
            var clearIsDirty = true;

            var cachedValues = pageManager.GetCachedValuesForItem(item);

            Debug.Assert(cachedValues != null);

            var itemProperties = this.ItemProperties;

            foreach (var itemProperty in itemProperties)
            {
                var currentValue = ItemsSourceHelper.GetValueFromItemProperty(itemProperty, item);

                if (!(object.Equals(currentValue, cachedValues[PropertyRouteParser.Parse(itemProperty)])))
                {
                    clearIsDirty = false;
                    break;
                }
            }

            if (clearIsDirty)
            {
                pageManager.ClearCachedValuesForItem(item);
            }

            base.OnEditCanceled(e);
        }
        internal override void OnEditBegun(DataGridItemEventArgs e)
        {
            var item        = e.Item;
            var pageManager = this.RootGroup.GetVirtualPageManager();

            if (!pageManager.IsItemDirty(item))
            {
                // First time we enter edit on this item.
                var itemProperties = this.ItemProperties;
                var count          = itemProperties.Count;

                var propertyNames = new string[count];
                var cachedValues  = new object[count];

                for (int i = 0; i < count; i++)
                {
                    var itemProperty = itemProperties[i];

                    propertyNames[i] = PropertyRouteParser.Parse(itemProperty);
                    cachedValues[i]  = ItemsSourceHelper.GetValueFromItemProperty(itemProperty, item);
                }

                // Cache the values of the never edited before row.  This will help the developer find the corresponding row
                // in the source when times comes to commit the changes to the data source.
                pageManager.SetCachedValuesForItem(item, propertyNames, cachedValues);
            }

            base.OnEditBegun(e);
        }
Пример #4
0
        internal virtual PropertyRouteSegment ToPropertyRouteSegment()
        {
            var route = PropertyRouteParser.Parse(this.Name);

            if ((route == null) || (route.Parent != null))
            {
                return(new PropertyRouteSegment(PropertyRouteSegmentType.Property, this.Name));
            }

            return(route.Current);
        }
Пример #5
0
        internal static PropertyRoute Combine(PropertyRouteSegment segment, PropertyRoute ancestors)
        {
            if (ancestors == null)
            {
                return(new PropertyRoute(segment));
            }

            if (ancestors.Current.Type != PropertyRouteSegmentType.Other)
            {
                return(new PropertyRoute(segment, ancestors));
            }

            var path = PropertyRouteParser.Parse(new PropertyRoute(segment, new PropertyRoute(ancestors.Current)));

            Debug.Assert(!string.IsNullOrEmpty(path));

            return(new PropertyRoute(new PropertyRouteSegment(PropertyRouteSegmentType.Other, path), ancestors.Parent));
        }
        private static PropertyRouteSegment ToSegment(DataGridItemPropertyBase itemProperty)
        {
            Debug.Assert(itemProperty != null);

            var route = PropertyRouteParser.Parse(itemProperty.Name);

            if (route == null)
            {
                throw new ArgumentException("Unexpected DataGridItemPropertyBase.Name property value.", "itemProperty");
            }

            if (route.Parent == null)
            {
                return(route.Current);
            }

            return(new PropertyRouteSegment(PropertyRouteSegmentType.Other, itemProperty.Name));
        }
        private static void UpdateColumnsForeignKeyConfigurationsFromPropertyDescriptions(
            ObservableColumnCollection columns,
            PropertyDescriptionRouteDictionary propertyDescriptions,
            bool autoCreateForeignKeyConfigurations)
        {
            if ((columns == null) || (propertyDescriptions == null))
            {
                return;
            }

            foreach (var column in columns)
            {
                var targetColumn = column as Column;
                if (targetColumn == null)
                {
                    continue;
                }

                var key = PropertyRouteParser.Parse(targetColumn.FieldName);
                if (key == null)
                {
                    continue;
                }

                var propertyDescription = propertyDescriptions[key];
                if (propertyDescription == null)
                {
                    continue;
                }

                var foreignKeyDescription = propertyDescription.Current.ForeignKeyDescription;
                if (foreignKeyDescription == null)
                {
                    continue;
                }

                ForeignKeyConfiguration.SynchronizeForeignKeyConfigurationFromForeignKeyDescription(targetColumn, foreignKeyDescription, autoCreateForeignKeyConfigurations);
            }
        }
 internal static string Parse(DataGridItemPropertyBase itemProperty)
 {
     return(PropertyRouteParser.Parse(PropertyRouteBuilder.ToPropertyRoute(DataGridItemPropertyRoute.Create(itemProperty))));
 }