依赖属性
**定义:**自己没有值,由别人给他赋值
应用场景
- 要求属性支持绑定(只有依赖属性可以绑定)
- 自定义控件/扩展控件属性
- 验证/强制回调
- 继承
- 附加属性(一种特殊的依赖属性)
创建依赖属性
快捷键propdp+tab(两次)
可以看到下面代码,创建依赖属性分为三步:定义,注册和包装
cs
//包装
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));
上面代码中Register里面参数内容

属性名称就是页面中控件属性名称,要和属性名称相同
所有者类型是这个属性所在的类的类型
属性元数据是初始属性数据
使用依赖属性来绑定用户控件内部控件属性
当我们将label和textbox作为一个用户控件使用时,要想对label的content属性或者textbox的text进行赋值,无法直接进行。
userControl.xaml文件
在这里面做绑定,绑定自己定义在cs文件里面的依赖属性,绑定方式也要注意不能使用普通的绑定方式,依赖属性 是控件的"内置属性",需通过 ElementName来进行绑定,绑定源是控件
而非默认的 DataContext
XML
<UserControl x:Class="WPF_try.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPF_try"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
x:Name="root">
<Grid>
<StackPanel Orientation="Vertical">
<Label x:Name="label" Content="{Binding LabelText, ElementName=root}"/>
<TextBox x:Name="textBox" Width="200" Text="{Binding Text, ElementName=root, Mode=TwoWay}"/>
</StackPanel>
</Grid>
</UserControl>
userControl.cs文件
依赖属性,作为整个用户控件对外的设置接口
cs
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
// 标签文本属性
public static readonly DependencyProperty LabelTextProperty =
DependencyProperty.Register(
"LabelText",
typeof(string),
typeof(UserControl1),
new PropertyMetadata("Default Label"));
// 文本框内容属性
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register(
"Text",
typeof(string),
typeof(UserControl1),
new FrameworkPropertyMetadata(
default(string),
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public string LabelText
{
get { return (string)GetValue(LabelTextProperty); }
set { SetValue(LabelTextProperty, value); }
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
}
mainwindow.xaml文件
将依赖属性和cs文件中的属性进行绑定指定他的初始值,或者使用赋值方式给与值
XML
<StackPanel>
<local:UserControl1 LabelText="用户名" Text="{Binding UserName}"/>
<local:UserControl1 LabelText="密码" Text="{Binding Password}"/>
</StackPanel>
mainwindow.cs文件
cs
public partial class MainWindow : Window
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
}
private string _userName="sdad";
public string UserName
{
get { return _userName; }
set { _userName = value; }
}
private string _password="123456";
public string Password
{
get { return _password; }
set { _password = value; }
}
}