private void RemoveLiveShapingProperty(string oldSortPropertyName, LiveShapingCategory category)
        {
            var liveShapingProperty = new LiveShapingProperty(oldSortPropertyName, category);
            var oldDp = ActiveDependencyProperties[liveShapingProperty];

            LiveShapingItems.Values.ForEach(lsi => lsi.RemoveBinding(oldDp));
            ActiveDependencyProperties.Remove(liveShapingProperty);
        }
        private void AddLiveShapingProperty(string newPropertyName, LiveShapingCategory category)
        {
            var newDp = DependencyPropertiesCache.GetOrAdd(GetDependencyPropertyNameFor(newPropertyName, category),
                                                           name => DependencyProperty.Register(name, typeof(object), typeof(LiveShapingSortedValueList <>)));

            var lsp = new LiveShapingProperty(newPropertyName, category);

            ActiveDependencyProperties.Add(lsp, newDp);
            LiveShapingItems.Values.ForEach(lsi => RegisterBinding(lsi, lsp, newDp));
        }
        private void ClearAllLiveShapingPropertiesOf(LiveShapingCategory category)
        {
            List <LiveShapingProperty> lspsToRemove = new List <LiveShapingProperty>();

            foreach (var adpPair in ActiveDependencyProperties.Where(pair => pair.Key.Category == category))
            {
                var dependencyProperty = adpPair.Value;
                LiveShapingItems.Values.ForEach(lsi => lsi.RemoveBinding(dependencyProperty));

                lspsToRemove.Add(adpPair.Key);
            }

            lspsToRemove.ForEach(lsp => ActiveDependencyProperties.Remove(lsp));
        }
 private NotifyCollectionChangedEventHandler CreateCollectionChangedEventHandlerFor(LiveShapingCategory category)
 {
     return((sender, args) => {
         if (args.Action == NotifyCollectionChangedAction.Reset)
         {
             ClearAllLiveShapingPropertiesOf(category);
             ((IEnumerable <string>)sender).ForEach(
                 newPropertyName => AddLiveShapingProperty(newPropertyName, category));
         }
         else if (args.Action != NotifyCollectionChangedAction.Move)
         {
             args.OldItems?.Cast <string>()
             .ForEach(oldPropertyName => RemoveLiveShapingProperty(oldPropertyName, category));
             args.NewItems?.Cast <string>()
             .ForEach(newPropertyName => AddLiveShapingProperty(newPropertyName, category));
         }
     });
 }
 public LiveShapingProperty(string propertyName, LiveShapingCategory category)
 {
     PropertyName = propertyName;
     Category     = category;
 }
 private static string GetDependencyPropertyNameFor(string propertyName, LiveShapingCategory category)
 => $"{category} {typeof(T).Name} {propertyName} (Live)";