深入显出WPF 第二部分(13)

深入浅出WPF 第二部分(13)

第7章 深入浅出话属性

7.1  属性(Property)的来龙去脉

程序的本质就是“数据+算法”。

属性仅仅是语法糖衣(Syntax Sugar),一个get方法,一个set方法。

7.2 依赖属性(Dependency Property)

7.2.1 依赖属性对内存的使用方式

WPF允许对象在被创建的时候并不包含用于存储数据的空间(即字段所占用的空间),只保留在需要用到数据时能够获得默认值,借用其他对象数据或实时分配空间的能力——这种对象就称为依赖对象(Dependency Object)而它这种实时获取数据的能力则依靠依赖属性(Dependency Property)来实现。

在WPF系统中,依赖对象的概念被DependencyObject类所实现,依赖属性的概念则由DependencyProperty类实现。

7.2.2 声明和使用依赖属性

想使用自定义的DependencyProperty,宿主一定是DependencyObject的派生类。DependencyProperty实例的声明特点鲜明——引用变量由public static readonly三个修饰符修饰,实例并非使用new操作符得到而是使用DependencyProperty.Register方法生成。

using System.Windows;
using System.Windows.Data;

namespace FirstWpfApplication.Objects
{
    class Student : DependencyObject
    {
        public static readonly DependencyProperty NameProperty = 
            DependencyProperty.Register("Name", typeof(string), typeof(Student));

        public string Name
        {
            get { return (string)GetValue(NameProperty); }
            set { SetValue(NameProperty, value); }
        }

        public BindingExpressionBase SetBinding(DependencyProperty dp, BindingBase binding)
        {
            return BindingOperations.SetBinding(this, dp, binding);
        }
    }
}


    <Grid x:Name="g1" Background="Orange" Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="40"/>
            <RowDefinition Height="40"/>
            <RowDefinition Height="40"/>
        </Grid.RowDefinitions>
        <TextBox x:Name="textBox1" Grid.Row="0" Margin="5" BorderBrush="Black"/>
        <TextBox x:Name="textBox2" Grid.Row="1" Margin="5" BorderBrush="Black"/>
        <Button Content="OK" x:Name="buttonLogin" Grid.Row="4" Width="60" Height="25" Click="buttonLogin_Click"/>
    </Grid>

        private void buttonLogin_Click(object sender, RoutedEventArgs e)
        {
            Student stu = new Student();
            stu.SetValue(Student.NameProperty, textBox1.Text);

            textBox2.Text = (string)stu.GetValue(Student.NameProperty);
        }