Category Archives: Dependency Property

Aplanar propiedades de dependencia

Muy útil para evitar tener propiedades redundantes cuando hay herencia (recuerda que las propiedades de dependencia pueden ser heredables). Here I go with the explanation!

Problema:

  1. Tenemos una estructura en árbol de padres e hijos, todos ellos DependencyObjects.
  2. Tenemos una propiedad de dependencia heredable
  • Queremos que el valor de la propiedad de dependencia más repetido en los hijos pase a ser el valor del padre.
  • A partir de ese momento, la propiedad en el padre es el valor más repetido en sus hijos.

¿Qué podemos hacer ahora?

Puesto que por el mecanismo de herencia, el valor del padre se hereda en los hijos, lo ideal sería que si el padre tiene el valor más repetido, en todos los hijos que tengan el valor más repetido se “reseteara” la propiedad. Haciendo esto, efectivamente, el hijo hereda el valor del padre automáticamente, que además será el valor óptimo (el más repetido). Además, esto es recursivo, por lo que el padre de todos los padres tendrá los valores más comunes dentro de sus hijos.

Esto puede ser útil en varias ocasiones (a mí ya me ha sido útil Winking smile)

Aquí dejo el código:

 private static void FlattenProperty(IParentOfDependencyObjectChildren parent,
            DependencyProperty dependencyProperty)
        {
            var childrenList = parent.Children.ToList();

            if (childrenList.Any())
            {
                foreach (IParentOfDependencyObjectChildren child in childrenList)
                {
                    FlattenProperty(child, dependencyProperty);
                }

                var values = childrenList.Select(o => o.GetValue(dependencyProperty)).ToList();
                var mostRepeated = values.GetMostRepeatedItem();
                foreach (var child in childrenList)
                {
                    if (child.GetValue(dependencyProperty).Equals(mostRepeated))
                    {
                        child.ClearValue(dependencyProperty);
                    }
                }
                parent.SetValue(dependencyProperty, mostRepeated);
            }
        }
 public static class EnumerableExtensions
    {
        public static T GetMostRepeatedItem<T>(this IEnumerable<T> list)
        {
            // group by value and count frequency
            var query = from i in list
                        group i by i into g
                        select new { g.Key, Count = g.Count() };



            // compute the maximum frequency
            var ordenada = (from c in query orderby c.Count descending select c);

            return ordenada.First().Key;
        }
    }
    public interface IParentOfDependencyObjectChildren
    {
        IEnumerable<DependencyObject> Children { get; }
        void SetValue(DependencyProperty dependencyProperty, object value);
    }