// Fires when the property to update is changed private static void OnTargetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContainsItemBehavior behavior = (ContainsItemBehavior)d; // Update bindings to reflect the new target property if (e.OldValue is string) { behavior.clearValueBinding((string)e.OldValue); } if (e.NewValue is string) { behavior.setValueBinding((string)e.NewValue); } }
// Fires when a collection is specified private static void OnCollectionPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ContainsItemBehavior behavior = (ContainsItemBehavior)d; if (e.NewValue is INotifyCollectionChanged) { // Validate the new collection to ensure that it has a Contains method // with the expected signature MethodInfo info = e.NewValue.GetType().GetMethod("Contains"); if (info == null) { throw new ArgumentException(Strings.ContainsErrorMessage); } if (info.ReturnType != typeof(bool) && info.ReturnType != typeof(bool?)) { throw new ArgumentException(Strings.ContainsErrorMessage); } ParameterInfo[] parameters = info.GetParameters(); if (parameters.Length != 1) { throw new ArgumentException(Strings.ContainsErrorMessage); } // Store the type of item the Contains method expects behavior._expectedItemType = parameters[0].ParameterType; // Hook-up to check whether the collection contains the item when the collection changes ((INotifyCollectionChanged)e.NewValue).CollectionChanged += behavior.OnCollectionChanged; // Check whether the item is present in the collection behavior.checkContains(); } // Unhook from the previous collection if (e.OldValue is INotifyCollectionChanged) { ((INotifyCollectionChanged)e.OldValue).CollectionChanged -= behavior.OnCollectionChanged; } }