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下載

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM