2014-02-06 48 views
0

我正在使用2個屬性之間的數據綁定(綁定目標是依賴項屬性)。如果我更改綁定源的值,則綁定目標也會更改(依賴項屬性的值)。我的問題是:如何處理依賴項屬性的值更改?如何處理依賴項屬性的值更改?

編輯:這是我如何註冊我的依賴屬性:

public static DependencyProperty ItemsProperty = DependencyProperty.Register(
    ItemsPropertyName, 
    typeof(List<ModelItem>), 
    typeof(CentralPanel), 
    new UIPropertyMetadata(null, OnItemsChanged)); 

所以,當我把斷點OnItemsChanged,該方法只運行一次,如果暴飲暴食源的值設置爲第一次。然後,當我更改綁定源的值時,綁定目標的值也會改變,但OnItemsChanged不會觸發,爲什麼?

+0

當你說_I改變source_你綁定的值更改列表中的整個列表或項目? – dkozl

+0

@dkozl:我改變了整個列表。它有什麼區別? –

+0

'OnItemsChanged'只有當您將其設置爲'List '的不同實例時纔會觸發。它不會觸發,如果它將是列表添加或刪除列表中的項目相同的列表 – dkozl

回答

0

我其實結算清單,並加入新的元素

OnItemsChanged將觸發只有當你將它設置爲List<ModelItem>不同的實例。如果它將與列表中添加或刪除項目的列表相同,它將不會觸發。

如果您希望在添加/刪除項目時通過界面更改通知UI,它必須實現INotifyCollectionChanged界面,或者您可以使用現成的實施ObservableCollection<T>而不是List<T>

如果你想趕上在代碼更改集合,您可以訂閱CollectionChanged事件

時發生的項目添加,刪除或更改,移動或整個列表被刷新。

你可以做到這一點在OnItemsChanged回調:

private void OnItemsChanged(DependencyPropertyChangedEventArgs e) 
{ 
    var oldList = e.OldValue as ObservableCollection<ModelItem>; 
    if (oldList != null) oldList.CollectionChanged -= MyCollectionChangedCallback; 
    var newList = e.NewValue as ObservableCollection<ModelItem>; 
    if (newList != null) newList.CollectionChanged += MyCollectionChangedCallback; 
} 
+0

我是否可以幫助... –

+0

如何訂閱CollectionChanged事件?即使在現在,當對象的新實例被設置爲一個值並且我將綁定源和目標更改爲ObservableCollection而不是List時,捕獲更改(OnItemChanged中的斷點)方法的標準方法也不起作用。 –

+0

當您使用ObservableCollection時,您只會繼續使用一個實例,並在添加/刪除項目時通知用戶界面。所以當你做'var myList = new ObservableCollection (); myList.CollectionChanged + = MyCollectionChangedCallback;'每次當你添加/刪除你的集合中的物品時,它會調用'MyCollectionChangedCallback' – dkozl

0

每個網格視圖都有一組在網格視圖的.aspx定義中定義的事件函數,並且它們在頁面的aspx.cs後面的代碼中進行了控制。事件的

EventArgs的參數包含某個屬性的價值的兩種定義:e.NewValues [「屬性名」]。此屬性可幫助您處理您的依賴屬性的更改值。

問候, ANDOURA

+0

是的,沒錯。但問題是,OnItemsChanged,我可以檢查e的值,只運行一次。因此它將e.NewValue顯示爲一個值,將e.OldValue顯示爲null。我相信,當它運行下一次,它將覆蓋的OldValue,但問題是,這種情況下只運行一次:) –

+0

嘗試使用以下甚至** ** OnItemsSourceChanged: '公共靜態只讀的DependencyProperty ItemsSourceProperty 新的PropertyProxy.Register(「ItemsSource」,typeof(IEnumerable),typeof(ItemsControl), new FrameworkPropertyMetadata((IEnumerable)null, new PropertyChangedCallback(OnItemsSourceChanged))); 私有靜態無效** ** OnItemsSourceChanged(DependencyObject的d,DependencyPropertyChangedEventArgs E)' { ** e.Old **和** ** e.New} 讓 – Ando