前言
依赖属性由于它占用内存小的特点在wpf的自定义控件中得到了广泛应用,本文就来介绍wpf中依赖属性的用法。
1、自定义依赖属性
下面的代码使用 DependencyProperty.Register声明并注册了一个依赖属性,Register方法的4个参数含义如下:
1)属性名称
这里是IsHighlighted
2)属性的类型
IsHighlighted的类型是bool
3)属性所有者类型
IsHighlighted属性属于CustomButton类中的成员,所以为CustomButton
4)属性元数据
PropertyMetadata类型构造函数第一个参数为属性默认值可以设置为false,OnIsHighlightedChanged是属性值改变时的回调函数。
csharp
class CustomButton : Button
{
public CustomButton()
{
this.Background = new SolidColorBrush(Colors.Red);//初始化设置为红色
}
public static readonly DependencyProperty IsHighlightedProperty =
DependencyProperty.Register(
"IsHighlighted", // 属性的名称(与包装器一致)
typeof(bool), // 属性的类型
typeof(CustomButton), // 属性所有者的类型(定义该属性的类)
new PropertyMetadata( // 属性的元数据
false, // 默认值
OnIsHighlightedChanged) // 属性值改变时的回调方法(可选)
);
// 2. 可选的属性值改变回调方法
private static void OnIsHighlightedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// d 是属性值发生改变的那个对象CustomButton的实例)
var control = (CustomButton)d;
bool newValue = (bool)e.NewValue;
bool oldValue = (bool)e.OldValue;
// 在这里可以响应属性的变化,例如触发一些逻辑或重绘控件
control.UpdateVisualState();
}
// 3. 标准的 CLR 属性包装器
public bool IsHighlighted
{
get { return (bool)GetValue(IsHighlightedProperty); }
set { SetValue(IsHighlightedProperty, value); }
}
private void UpdateVisualState()
{
// 根据 IsHighlighted 的值更新控件外观
if (IsHighlighted)
{
this.Background = new SolidColorBrush(Colors.Green);//高亮状态逻辑
}
else
{
this.Background = new SolidColorBrush(Colors.Red); // 普通状态逻辑
}
}
}
2、声明一个ViewModelBase类
csharp
public class ViewModelBase
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propname));
}
}
}
3、声明一个ViewModel类继承ViewModelBase
csharp
public class ViewModel:ViewModelBase
{
private bool isHighLight = false ;
public bool IsHighLight
{
get
{
return isHighLight;
}
set
{
this.isHighLight = value;
OnPropertyChanged("IsHighLight");
}
}
}
4、窗体类
csharp
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
5、xaml代码
下面的代码中CustomButton 的IsHighlighted作为依赖属性绑定了ViewModel中的IsHighLight属性;CheckBox 的IsChecked属性绑定了ViewModel中的IsHighLight属性;这样当我点击CheckBox的时候ViewModel中的IsHighLight属性会改变,IsHighLight属性改变又会改变CustomButton 的IsHighlighted属性,这样就能触发OnIsHighlightedChanged方法,该方法的作用是当IsHighlighted为true时,将CustomButton背景色改成绿色,否则改成红色。
csharp
<Window x:Class="wpf之依赖属性.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf之依赖属性"
mc:Ignorable="d"
Title="依赖属性" Height="450" Width="800">
<Grid>
<StackPanel Orientation="Vertical" >
<local:CustomButton Height=" 100" IsHighlighted="{Binding IsHighLight}" />
<CheckBox Height=" 100" IsChecked="{Binding IsHighLight,Mode=TwoWay }" />
</StackPanel >
</Grid>
</Window>
CheckBox 选中时的界面:
CheckBox 取消选中时的界面:
从这里的效果可以看出CustomButton 的IsHighlighted依赖属性已经成功应用了。