private static void isReadOnlyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            TagPickerView view = (TagPickerView)d;

            bool isReadOnly = (bool)e.NewValue;

            view.addButton.IsEnabled             = !isReadOnly;
            view.clearButton.IsEnabled           = !isReadOnly;
            view.addTagAutoCompleteBox.IsEnabled = !isReadOnly;
            view.tagListBox.IsEnabled            = !isReadOnly;
        }
        static void tagsChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            TagPickerView control = (TagPickerView)o;

            ObservableCollection <Tag> tags = (ObservableCollection <Tag>)e.NewValue;

            control.selectedTags.Clear();

            // WeakEventManager info:
            // http://www.kolls.net/blog/?p=17
            if (e.OldValue != null)
            {
                WeakEventManager <ObservableCollection <Tag>, NotifyCollectionChangedEventArgs> .RemoveHandler(
                    control.tagListBox.ItemsSource as ObservableCollection <Tag>, "CollectionChanged", control.tagPickerTags_CollectionChanged);
            }

            control.tagListBox.ItemsSource = tags;

            if (e.NewValue != null)
            {
                WeakEventManager <ObservableCollection <Tag>, NotifyCollectionChangedEventArgs> .AddHandler(
                    control.tagListBox.ItemsSource as ObservableCollection <Tag>, "CollectionChanged", control.tagPickerTags_CollectionChanged);
            }
        }