我有一個用戶控件,它公開了一個名爲VisibileItems的DependencyProperty 每當該屬性得到更新時,我需要觸發另一個事件。 爲了達到這個目的,我用PropertyChangedCallback事件添加了一個FrameworkPropertyMetadata。WPF:PropertyChangedCallback只觸發一次
由於某些原因,此事件只被調用一次,並且在下次VisibleItems更改時不會觸發。
XAML:
<cc:MyFilterList VisibleItems="{Binding CurrentTables}" />
CurrentTables是MyViewModel一個DependencyProperty。當前表經常變化。我可以將另一個WPF控件綁定到CurrentTables,並且看到UI中的更改。
下面是我通過步入VisiblePropertyChanged有線VisibleItems與PropertyChangedCallback
public static readonly DependencyProperty VisibleItemsProperty =
DependencyProperty.Register(
"VisibleItems",
typeof(IList),
typeof(MyFilterList),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(VisiblePropertyChanged))
);
public IList VisibleItems {
get { return (IList)GetValue(VisibleItemsProperty); }
set { SetValue(VisibleItemsProperty, value); }
}
的方式,我可以看到它被觸發第一次CurrentTables被設定。但不是隨後的時間。
UPDATE
因爲你們中的一些質疑CurrentTables被修改的方式,它完全在變化重新分配:
OnDBChange()...
CurrentTables = new List<string>(MainDatabaseDataAdapter.GetTables(this.SelectedServer, this.SelectedDatabase));
此行被調用的每一個變化,但我VisiblePropertyChanged處理程序被調用只有第一次。
UPDATE
,如果我直接分配VisibleItems,處理程序是否被調用每一次!
TestFilterList.VisibleItems = new List<string>(Enumerable.Range(1, DateTime.Now.Second).ToList().Select(s => s.ToString()).ToList());
所以,它看起來像這個問題從的DependencyProperty(VisibleItems)莖看其他的DependencyProperty(CurrentTables)。不知何故,綁定工作在第一次財產變動,但不是在後續的變化? 正如你們中的一些人所建議的,試圖用snoop來檢查這個問題。
你確定綁定保持不變?我將使用Snoop來驗證綁定是否正確更新VisibleItems屬性。 – 2011-04-26 20:57:30
你暗示但不是明確的:你確定'VisibleItems'實際上改變到一個不同的值,沒有改變屬性被調用的回調? – 2011-04-26 21:13:22
裏克,是的,我相信,我可以通過它看到它被調用,現在我在每次調用時創建一個「新列表」,以確保它不是同一個實例。而且如果您查看代碼,您可以看到它每次都從數據庫獲取列表。 – 2011-04-26 22:23:45