2011-12-01 66 views
2

我回答了關於在代碼隱藏中創建綁定的another question,我最初嘗試回答它是發佈沒有指定Path的綁定代碼。這個綁定編譯得很好,但是值永遠不會更新。如果我將綁定更改爲使用Path,它可以正常工作。如何在未指定路徑的代碼隱藏中創建綁定?

這是爲什麼?在沒有Path的代碼隱藏中創建綁定的正確方法是什麼?例如,我將如何在代碼隱藏中重新創建Value="{Binding }"

非工作代碼:

Binding b = new Binding(); 
b.Source = SomeInt; 
b.Mode = BindingMode.OneWay; 
MyProgressBar.SetBinding(ProgressBar.ValueProperty, b); 

SomeInt = 50; 

工作代碼:

Binding b = new Binding(); 
b.Source = this; 
b.Path = new PropertyPath("SomeInt"); 
MyProgressBar.SetBinding(ProgressBar.ValueProperty, b); 

SomeInt = 50; 

回答

2

綁定引擎預訂的Source對象上INPCDP -changes(和非葉上Path),並檢查Path屬性/屬性是否已被更改。如果沒有Path則沒有通知。一個相當不幸的缺點。

(我可能是過於簡單化的系統一點,但本質是,有到源的變化沒有更新,他們也不能進行監控)


{Binding}相當於new Binding()(沒有附加屬性),此綁定可能會更新,因爲有更改DataContext的事件。

+0

這可能也是如此:'INPC'表示哪個*屬性*發生了變化。沒有機制可以說「整個*對象*改變了」。 –

+0

@JoeWhite然而,我可以將我的綁定設置爲空('{Binding}'),並且'PropertyChange'通知工作得很好。沒有辦法在代碼隱藏方面做到這一點? – Rachel

+0

@Rachel:這是因爲有DataContext更改的通知,但這是該規則的一個例外。 –

1

Binding.Source鍵入爲System.Object。所以,當你這樣做:

b.Source = SomeInt; 

你弄成System.Object型的,這意味着你會得到原始值的副本盒裝分配一個值類型(System.Int32)。

盒裝副本生活在堆上,與原始變量無關。當您修改原始變量時,盒裝副本沒有任何反應。

相關問題