【问题标题】:ObservableCollection has Depedency Property in SilverlightObservableCollection 在 Silverlight 中具有依赖属性
【发布时间】:2011-10-18 07:21:29
【问题描述】:

最近我在 Silverlight 中开发了一个自定义控件,我创建了 ObservableCollection 类型的自定义依赖属性。我还有另外 2 个字符串类型的自定义依赖属性。我的要求是将任何项目添加到集合中,我必须触发 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 的值?我无法在CollectionChangedNotifyPropertyChanged 事件中访问这些属性,因为所有这些事件都是静态的。我无法访问这些静态事件处理程序中的实例。

我尝试使用转换器解决问题,但我对 Silverlight 的好奇使我想使用上述方法。如何在CollectionChanged 事件或NotifyPropertyChanged 事件中为这些依赖属性设置值?

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    静态 fun1 方法中的 sender 应该是声明 itemsProperty DependencyProperty 的类的实例。因此,您可以通过将发件人转换为您的类来访问具体实例。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多