user145610
user145610

Reputation: 3025

ObservableCollection has Depedency Property in Silverlight

Recently i was developing a custom control in Silverlight, I created custom dependency property which is of type ObservableCollection. I have another 2 custom dependency properties of type strings. My requirement is on addition of any item to collection, I have to fire collectionChanged Event , in this event handler, i want to update the other 2 dependency properties.

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"); }
    }

How can I change the values of the dependency properties messageType and Header? I'm unable to access those properties in either the CollectionChanged or NotifyPropertyChanged event since all those events are static. I cannot access the instance within these static event handlers.

I tried to fix the problem with a converter, but my curosity on Silverlight makes me want to use the above approach. How can I set values for those dependency properties within CollectionChanged event or NotifyPropertyChanged events?

Upvotes: 0

Views: 363

Answers (1)

user604613
user604613

Reputation:

The sender in your static fun1 method should be the instance of the class which declares the itemsProperty DependencyProperty. Therefore you can access the concrete instance with casting the sender to your class.

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

Upvotes: 1

Related Questions