2011-09-07 78 views
4

我有一個類包含另一個類的ObservableCollection。如果其中一個類成員發生更改,我希望得到通知,因爲我需要在MediaCollection類中進行一些計算。所以我增加了一個事件的那類:如何從同一個類中的靜態函數調用公共事件?

public event PropertyChangedEventHandler PropertyChangedEvent; 

被稱爲在此集合類:

public class MediaCollection : INotifyPropertyChanged 
{ 
    private List<MediaEntry> ModifiedItems = new List<MediaEntry>(); 
    private ObservableCollection<MediaEntry> tagList = new ObservableCollection<MediaEntry>(); 

    public MediaCollection() 
    { 
     tagList = new ObservableCollection<MediaEntry>(); 
     tagList.CollectionChanged += CollectionChangedHandler; 
    } 

    public void CollectionChangedHandler(object sender, NotifyCollectionChangedEventArgs e) 
    { 
      foreach (MediaEntry newItem in e.NewItems) 
      { 
       ModifiedItems.Add(newItem); 
       newItem.PropertyChangedEvent += OnItemPropertyChanged; 
      } 
    ... 
    } 

    public void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     MediaEntry item = sender as MediaEntry; 
     if (item != null)  
      ModifiedItems.Add(item); 
    } 

的MediaEntry類看起來是這樣的:

public class MediaEntry : DependencyObject 
{ 
    public event PropertyChangedEventHandler PropertyChangedEvent; 

    public bool IsError 
    { 
     get { return (bool)GetValue(IsErrorProperty); } 
     set { SetValue(IsErrorProperty, value); } 
    } 
    public static readonly DependencyProperty IsErrorProperty = 
     DependencyProperty.Register("IsError", typeof(bool), typeof(MediaEntry), new 
     UIPropertyMetadata(PropertyChanged)); 

    public static void PropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     if (obj is MediaEntry) 
     { 
      ((MediaEntry)obj).ObjectPropertyChanged(args); 
     } 
    } 

該調用會通知UI等等,但要將事件引發到容器類,我需要引發PropertyChangedEvent(在容器類中偵聽)。根據文件,我需要添加這些行:

public static void PropertyEventChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
{ 
    PropertyChangedEventHandler handler = PropertyChangedEvent; 
    if (handler != null) 
    { 
     handler(obj, new PropertyChangedEventArgs(args.Property.Name)); 
    } 
} 

,我需要從公共靜態無效調用的PropertyChanged功能。但是,這裏是真正的問題,我如何從靜態函數中調用公共事件?

我已經嘗試了許多人一樣,許多事情:

  • 更改公共事件PropertyChangedEventHandler到公共靜態事件。這將給出如下錯誤:「成員MediaEntry.PropertyChangedEvent不能通過實例引用進行訪問;使用類型名稱來代替它」

  • 將public static void PropertyChanged更改爲非靜態版本,但這會在所有UIPropertyMetadata(PropertyChanged))部件上發生錯誤,並顯示以下錯誤消息:「非靜態字段,方法或屬性需要對象引用」

  • 還有一些,但都無濟於事。

我以某種方式認爲我需要這裏的代表,但現在不要如何或從哪裏開始。在解決我的問題時,我非常感謝任何幫助。

回答

2

當您註冊IsError DependencyProperty將UIPropertyMetadata傳遞給它時,您將設置將在屬性更改時調用的方法。你的情況是

public static void PropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 

爲其屬性已更改與obj這種方法通過,並在ARGS您發現更改的屬性和新舊價值的實例。這就是您必須致電您的活動的地方。您只是錯過了ObjectPropertyChanged的實現,它不是靜態的,因爲您正在使用傳遞給您的PropertyChanged方法傳遞給MediaEntry的參數。實現類似於你試圖用PropertyEventChanged,唯一的區別在於它是不是靜態的,你不傳遞任何對象給它什麼:

public void ObjectPropertyChanged(DependencyPropertyChangedEventArgs args) 
{ 
    PropertyChangedEventHandler handler = PropertyChangedEvent; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(args.Property.Name)); 
    } 
} 

BTW我會嘗試用更好的名稱,因爲在閱讀PropertyEventChanged和PropertyChangedEvent以及Property和Changed :-)的許多不同組合時,很容易混淆。

+0

你剛剛救了一天!我完全目睹了被調用的OnPropertyChanged(是的,我已經有了它,但在代碼中沒有提到)。從那裏我可以舉辦我的活動和一切作品就像一個魅力。非常感謝Francesco。 – riesm

+0

是的,我應該改變我的財產名稱,因爲這可能是這個問題的開始! – riesm

相關問題