2010-08-24 68 views
3

我用代理使用Castle DP包裝我的實體,我的實體自己實現INotifyPropertyChanged。並在調用set時提升事件。WPF上的城堡動態代理和INotifyPropertyChanged

我寫了一些關於包裝的單元測試,看到當我通過代理操縱實體並且他們都通過時,propertychanged事件被觸發。

問題是在屏幕上的一個真正的應用程序,當我將屏幕綁定到一個屬性,實際上是一個DP,屏幕註冊屬性changedchanged以不同的方式,它只是不工作,除非我實現攔截器代碼

爲什麼是這樣的行爲,這是什麼WPF上,我做登記財產時沒有屬性裏面做的註冊管理改變了嗎?

+1

你能告訴我們你的代碼嗎? – 2010-08-24 14:06:32

+0

作者:DP,你的意思是動態代理或依賴屬性? – 2010-08-24 14:51:00

+0

我的意思是動態代理 – 2010-08-25 10:15:19

回答

0

作爲接口代理生成的代理類將有屬性和WPF結合將不工作,除非它explictely匹配的顯式接口實現。

兩個解決辦法是改變你的結合路徑明確地包括接口:

{Binding Path=(local:IEntity.ID)} instead of just {Binding ID} 

或使用虛擬代理的方法爲您的視圖模型/實體,讓你攔截虛擬的任何方法。

+0

綁定是好的..問題是與INPC – 2011-01-12 16:50:43

1

在城堡AOP中有一件重要的事情要記住 - Equals方法不能像您期望的那樣工作。

看這裏:RRSL-Lite.EntityAOP。我有同樣的想法 - 爲INPC創建AOP並創建這個庫。 Here是如何使用它的簡單示例。

0

這可能是由於您正在使用Castle的CreateInterfaceProxyWithTarget方法或類似方法將您的實體包裝起來。如果你相信你的實體實施INPC並中繼您PropertyChanged事件掛鉤到底層的代理目標,裸記住當PropertyChanged事件引發的sender將是你實體不是你代理。如果您試圖在WPF中綁定您的代理,它將預計sender代理。如果不是,它會忽略變化。解決方案是攔截事件並確保您將sender設置爲您的代理

相關問題