依賴項屬性 簡單理解 2018/1/3 15:36:07 dependency property 的簡單理解(略去大部頭理解) 依賴項屬性 依賴項屬性的值不是簡單的封裝欄位,而是根據其他的輸入值來決定本屬性的值。為什麼要這樣做?因為在WPF體系中,只有定義屬性為依賴項屬性,這個屬性才支持樣式設置,數 ...
依賴項屬性 簡單理解
2018/1/3 15:36:07
dependency property 的簡單理解(略去大部頭理解)
依賴項屬性
依賴項屬性的值不是簡單的封裝欄位,而是根據其他的輸入值來決定本屬性的值。為什麼要這樣做?因為在WPF體系中,只有定義屬性為依賴項屬性,這個屬性才支持樣式設置,數據綁定,繼承,動畫和預設值。
兩個關鍵行為:更改通知和動態值識別。
簡言之,依賴屬性就是一種可以自己沒有值,並能通過Binding從數據源獲得值(依賴在別人身上)的屬性。擁有依賴屬性的對象被稱為“依賴對象”。
wpf使用依賴項屬性的方式
當屬性發生變化時,依賴項屬性不會自動引發事件以通知屬性值發生了變化。會觸發受保護名為OnPropertyChangedCallback()的方法。該方法通過兩個wpf服務(數據綁定和觸發器)傳遞信息,並調用PropertyChangedCallback回調函數(如果已經定義了此函數)。
即:當屬性發生變化時,如果希望進行響應,則有兩種選擇:1.使用屬性值創建綁定 2.編寫能夠自動改變其他屬性或開始動畫的觸發器。
(省略了大部頭細節)
附加屬性
附加屬性(Attached Properties)就是說,一個屬性本來不屬於某個對象,但由於某種需求而被後來附加上。例如:Button控制項本身沒有Grid.Row屬性,但是將Button放在Grid佈局裡面,就可以用這個屬性來設置Button的位置。類似的,放在Canvas裡面,可以附加屬性Canvas.Top;放在DockPanel里,可以使用DockPanel.Dock。
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Background="Black" Grid.Column="1" Grid.Row="1"/>
</Grid>
附加屬性也可以使用Binding依賴在其他對象的數據上。例如:用兩個slider控制矩形在Canvas中的橫縱坐標。
<Canvas>
<Slider x:Name="sliderX" Canvas.Top="10" Canvas.Left="10" Width="260" Minimum="50" Maximum="200"/>
<Slider x:Name="sliderY" Canvas.Top="40" Canvas.Left="10" Width="260" Minimum="50" Maximum="200"/>
<Rectangle x:Name="rect" Fill="Blue" Width="30" Height="30" Canvas.Left="{Binding ElementName=sliderX,Path=Value}" Canvas.Top="{Binding ElementName=sliderY,Path=Value}"/>
</Canvas>
結果如圖: