WPF系列 —— 控件添加依賴屬性(轉) WPF系列 —— 控件添加依賴屬性

WPF系列 —— 控件添加依賴屬性

依賴屬性的概念,用途 ,如何新建與使用。本文用做一個自定義TimePicker控件來演示WPF的依賴屬性的簡單應用。

先上TimePicker的一個效果圖。

GIF

 

 

 

 

 

 

 

 

 

概念 和 用途:依賴屬性是對傳統.net 屬性的一種封裝,使一個傳統.net屬性支持 WPF 中的 數據綁定、動畫、樣式 等功能。

新建:任意代碼代碼文件中 ,輸入 propdp 再雙擊tab鍵。生成如下的代碼塊。

     MyProperty: 依賴屬性的名稱; ownerclass: 當前依賴屬性綁定的所有類; new PropertyMetadata 是依賴屬性的初始化對象,這裏0代表默認值。

複製代碼
public int MyProperty
{
    get { return (int)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));
複製代碼

使用:這裏我們使用綁定綁定,稍後使用自定義控件的Time屬性來介紹。

如何使用依賴屬性構建一個帶綁定的TimePicker自定義控件

新建一個項目名稱爲DependencyPropertyDemo的WPF 項目 image,新建一個TimePicker的自定義控件。Xaml佈局如下:

複製代碼
<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="9*"/>
            <ColumnDefinition Width="24"/>
            <ColumnDefinition Width="10*"/>
        </Grid.ColumnDefinitions>
        <ComboBox Name="cbbHour" Grid.Column="0"/>
        <Label Content=":" Grid.Column="1"/>
        <ComboBox Name="cbbMinute" Grid.Column="2"/>
    </Grid>
複製代碼

BehindCode新建一個名稱爲Time的依賴屬性,如下:

複製代碼
public string Time
        {
            get { return (string)GetValue(TimeProperty); }
            set { SetValue(TimeProperty, value); }
        }

        public static readonly DependencyProperty TimeProperty =
            DependencyProperty.Register("Time",
                typeof(string),
                typeof(TimePicker),
                new PropertyMetadata(defaultValue: "00:00", 
                    propertyChangedCallback: null,
                    coerceValueCallback: coerceValueCallback));

        private static object coerceValueCallback(DependencyObject d, object baseValue)
        {
            if (baseValue != null)
            {
                var control = d as TimePicker;
                var times = baseValue.ToString().Split(':');
                control.cbbHour.SelectedItem = times[0];
                control.cbbMinute.SelectedItem = times[1];
                return baseValue.ToString();
            }
            return baseValue;
        }
複製代碼

這裏詳細介紹一下PropertyMetadata的三個參數:defaultValue:默認值,不用介紹了;propertyChangedCallback:屬性變化後的通知事件,這裏不需要任何通知,所以傳入null值;coerceValueCallback:這是屬性值新值綁定時,通知事件,這裏使用得到的值來給控件賦值。到這裏Time依賴屬性也就完成一半了。

TimePicker屬性依賴屬性Time的綁定

綁定方式很簡單,如下圖。若Time是一個普通的.net屬性而非依賴屬性的話,是不能這樣使用綁定方式的。

<local:TimePicker HorizontalAlignment="Left" Margin="137,38,0,0" VerticalAlignment="Top" Width="161"
                          Time="{Binding StartTime,Mode=TwoWay}"/>

假設添加在TimePicker後臺添加一個Code的普通屬性,使用綁定的話,會出現如下的狀況。

image

 

後話總結

依賴屬性使用是有一定限制的,就是他註冊的類對象,也就是上文的ownerclass必須繼承DependencyObject 這個基類,不過不用擔心,WPF大部分元素都間接的集成這個基類。

本文實現的TimePicker控件可以在一些情況下解決WPF下沒有Time選擇控件的問題。

Demo下載

如果,您認爲閱讀這篇博客讓您有些收穫,請點擊下面的【推薦】和 【關注】按鈕,感謝大家的支持,我是朝兮兮。眨眼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章