ObservableCollection имеет свойство Depedency в Silverlight

#silverlight

#silverlight

Вопрос:

Недавно я разрабатывал пользовательский элемент управления в Silverlight, я создал пользовательское свойство зависимости, которое имеет тип ObservableCollection. У меня есть еще 2 пользовательских свойства зависимостей типа strings. Мое требование заключается в добавлении любого элемента в коллекцию, я должен запустить событие CollectionChanged , в этом обработчике событий я хочу обновить другие 2 свойства зависимостей.

 public static readonly DependencyProperty itemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<ValidationErrorMessage>), typeof(SummaryUserControl), new PropertyMetadata(new ObservableCollection<ValidationErrorMessage>(), new PropertyChangedCallback(fun1)));
    public ObservableCollection<ValidationErrorMessage> Items
    {
        get
        {
            return (ObservableCollection<ValidationErrorMessage>)base.GetValue(itemsProperty);
        }
        set
        {

            base.SetValue(itemsProperty, value);
        }
    }


public static void fun1(object sender, DependencyPropertyChangedEventArgs       evt)
    {
        var newValue =   evt.NewValue as ObservableCollection<ValidationErrorMessage>;

        if(newValue!=null)
            newValue.CollectionChanged  = new NotifyCollectionChangedEventHandler(CollectionChangedHandler);

        var oldValue  = evt.OldValue as ObservableCollection<ValidationErrorMessage>;
        if(oldValue!=null)
            oldValue.CollectionChanged -= new NotifyCollectionChangedEventHandler(CollectionChangedHandler);
    }

    static void CollectionChangedHandler(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
           var newItems =     e.NewItems as ObservableCollection<ValidationErrorMessage>;
           foreach (var item in newItems)
            {
                item.PropertyChanged  = new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
    }

    static void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {

    }



public static readonly DependencyProperty headerProperty = DependencyProperty.Register("Header", typeof(String), typeof(SummaryUserControl), new PropertyMetadata(String.Empty, null));
    public String Header
    {
        get
        {
            return (String)base.GetValue(headerProperty);
        }
        set
        {
            base.SetValue(headerProperty, value);
            RaisePropertyChange("Header");
        }
    }

    public static readonly DependencyProperty messageTypeProperty =
    DependencyProperty.Register("MessageType", typeof(MessageEnumType), typeof(SummaryUserControl), new PropertyMetadata(MessageEnumType.Error, null));
    public MessageEnumType MessageType
    {
        get { return (MessageEnumType)GetValue(messageTypeProperty); }
        set { SetValue(messageTypeProperty, value); RaisePropertyChange("MessageType"); }
    }
  

Как я могу изменить значения свойств зависимостей MessageType и Header? Я не могу получить доступ к этим свойствам ни в CollectionChanged NotifyPropertyChanged событии или, поскольку все эти события являются статическими. Я не могу получить доступ к экземпляру в этих статических обработчиках событий.

Я пытался решить проблему с помощью конвертера, но из-за моего недостатка в Silverlight мне хочется использовать описанный выше подход. Как я могу установить значения для этих свойств зависимостей в CollectionChanged событии или NotifyPropertyChanged событиях?

Ответ №1:

Отправителем в вашем статическом методе fun1 должен быть экземпляр класса, который объявляет свойство itemsProperty DependencyProperty . Поэтому вы можете получить доступ к конкретному экземпляру, приведя отправителя к вашему классу.

 public static void fun1(object sender, DependencyPropertyChangedEventArgs       evt) 
{
     MyClass concreteInstance = sender as MyClass;
     if(concreateInstance != null)
     {
         [...your code...]
     }
}