2011-10-18 39 views
0

最近我在Silverlight中開發自定義控件,我創建了ObservableCollection類型的自定義依賴項屬性。我有另外2個類型字符串的自定義依賴屬性。我的要求是添加任何項目收集,我必須觸發collectionChanged事件,在這個事件處理程序中,我想更新其他2個依賴屬性。ObservableCollection在Silverlight中具有Dependency屬性

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事件中爲這些依賴項屬性設置值?

回答

1

發件人在靜態FUN1方法應該是其聲明itemsProperty的DependencyProperty類的實例。因此,您可以通過將發件人轉換爲您的課程來訪問具體實例。

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