2011-08-04 46 views

回答

4

你重寫在WPF依賴屬性的方法是這樣....

public class MyListBox : ListBox 
    { 
     //// Static constructor to override. 
     static MyListBox() 
     { 
       ListBox.ItemsSourceProperty.OverrideMetadata(typeof(MyListBox), new FrameworkPropertyMetadata(null, MyListBoxItemsSourceChanged)); 
     } 

     private static void MyListBoxItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
      var myListBox = sender as MyListBox; 
      //// You custom code. 
     } 
    } 

這是你在找什麼?

+0

我想這個解決方案,我們不能做一些操作之前,分配itemssource權利..? MyListBoxItemsSourceChanged事件將在分配itemssource後被觸發... – Bathineni

+0

@AngelWPF:當問題被標記爲WPF和Silverlight時,您是否可以在答案中包含與答案相關的平臺。在這種情況下,這個答案只適用於WPF,Silverlight沒有'OverrideMetadata'方法。 – AnthonyWJones

+0

當然!我已編輯。 –

1

爲什麼不直接設置SourceUpdated事件處理程序中設置的項目源屬性之前?

例如,如果MyListBox是你的列表框& MyItemSource是源,你可以設置事件處理程序N通話,如下所示:

void MyFunction() 
     { 
      MyListBox.SourceUpdated += new EventHandler<DataTransferEventArgs>(MyListBox_SourceUpdated);  
      MyListBox.ItemsSource = MyItemSource; 
     } 

void MyListBox_SourceUpdated(object sender, DataTransferEventArgs e) 
     { 
      // Do your work here 
     } 

此外,請確保您的數據源實現INotifyPropertyChanged或INotifyCollectionChanged事件。

+0

我不想在外面創建獨立的事件..雖然分配itemssource屬性本身,我想做一些操作。 – curiosity

+1

什麼是'外部'在這裏?你想什麼時候執行'操作'? – loxxy

1

這裏我裝箱從列表框延伸的自定義列表框,它有一個依賴屬性的ItemsSource ...

當過項目源得到了更新,你可以做你的操作之後,你可以調用的updatesourcemethod customlistbox將分配BaseClass的itemsSource屬性。

public class CustomListBox : ListBox 
    { 

     public IEnumerable ItemsSource 
     { 
      get { return (IEnumerable)GetValue(ItemsSourceProperty); } 
      set { SetValue(ItemsSourceProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for ItemsSource. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty ItemsSourceProperty = 
      DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CustomListBox), new UIPropertyMetadata(0, ItemsSourceUpdated)); 

     private static void ItemsSourceUpdated(object sender, DependencyPropertyChangedEventArgs e) 
     { 
      var customListbox = (sender as CustomListBox); 
      // Your Code 
      customListbox.UpdateItemssSource(e.NewValue as IEnumerable); 
     } 

     protected void UpdateItemssSource(IEnumerable source) 
     { 
      base.ItemsSource = source; 
     } 
    }