I am trying to bind a WPF dependency property to an aggregate of a
collection. I've implemented a wrapper around a Dictionary that
implements INotifyCollectionChanged to fire the event when items are
added or removed.
Debugging through it I notice that there is nothing listening to the
event after I bind to it which I expected the SetBinding to do as I
don't know what delegate to attach to the event. It's the binding that
needs updating after all.
I've tried a test with just an ObservableCollection to see if I was
missing something but that doesn't work either.
How do I wire up the event to the binding or do whatever it takes to
get my test to pass?
Here's my test code:
[TestClass()]
public class ObservableDictionaryTest : DependencyObject
{
public class MaxDoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object
parameter, System.Globalization.CultureInfo culture)
{
if (value is IEnumerable<double>)
{
return ((IEnumerable<double>)value).Max(); // using
Linq
}
throw new ArgumentException("Cannot covert " +
value.GetType() + " to IEnumerable<double>", "value");
}
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
public double Max
{
get { return (double)GetValue(MaxProperty); }
}
public static readonly DependencyProperty MaxProperty =
DependencyProperty.Register("Max", typeof(double),
typeof(ObservableDictionaryTest), new PropertyMetadata(0.0));
[TestMethod()]
public void TestBindingToObservableCollection()
{
ObservableCollection<doublevalues = new
ObservableCollection<double>();
values.Add(1.0);
values.Add(2.0);
values.Add(3.0);
Binding b = new Binding();
b.Converter = new MaxDoubleConverter();
b.Source = values;
b.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(this, MaxProperty, b);
Assert.AreEqual(3.0, Max); // this works
values.Add(4.0);
Assert.AreEqual(4.0, Max); // this doesn't
values.Remove(4.0);
Assert.AreEqual(3.0, Max);
}
}