| Subject: Binding to INotifyCollectionChanged event |
| Group: microsoft.public.windows.developer.winfx.avalon |
| Date: 6/9/2008 6:36:37 AM |
| From: Some Bloke [Email Address Protection] |
I am trying to bind a 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 attached to the event after I bind to it which I expected the SetBinding to do as I don't know what delegate to bind to the event. 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 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<double> values = 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); } } |
| Back |