Dr WPF one of the most active WPF MSDN forum participant just posts a reply on MSDN forum on how to enumerate all the binding objects set on a specified DependencyObject, this guy who seems to have the whole WPF SDK imprinted into his brilliant mind really knows something about WPF:)
I just refactored his code a little bit, and made into my own WPF component/control library. kudos, Dr WPF:)
using System;
using System.Windows;
using System.Windows.Data;
using System.ComponentModel;
using System.Collections.Generic;
namespace Sheva.Windows.Components
{
public static class DependencyPropertyHelper
{
public static IList<DependencyProperty> GetAttachedProperties(Object element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
List<DependencyProperty> attachedProperties = new List<DependencyProperty>();
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(element,
new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.SetValues |
PropertyFilterOptions.UnsetValues |
PropertyFilterOptions.Valid) }))
{
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(pd);
if (dpd != null && dpd.IsAttached)
{
attachedProperties.Add(dpd.DependencyProperty);
}
}
return attachedProperties;
}
public static IList<DependencyProperty> GetProperties(Object element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
List<DependencyProperty> properties = new List<DependencyProperty>();
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(element,
new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.SetValues |
PropertyFilterOptions.UnsetValues |
PropertyFilterOptions.Valid) }))
{
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(pd);
if (dpd != null)
{
properties.Add(dpd.DependencyProperty);
}
}
return properties;
}
public static IEnumerable<Binding> EnumerateBindings(DependencyObject element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
LocalValueEnumerator lve = element.GetLocalValueEnumerator();
while (lve.MoveNext())
{
LocalValueEntry entry = lve.Current;
if (BindingOperations.IsDataBound(element, entry.Property))
{
Binding binding = (entry.Value as BindingExpression).ParentBinding;
yield return binding;
}
}
}
}
}
1 comments:
The problem with this approach is that it won't find the dependency properties if the source of the control is a Template.
-JLS
Post a Comment