<Grid>
<local:property Tag="123"/>
<local:property Tag="456" value="200"/>
</Grid>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace Property.zhaoxi
{
class property :Control
{
//普通属性
public int id { get; set; } = 12;
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
//依赖属性 所在对象 必须是依赖对象
//声明搞定
//readonly 只能被赋值一次,不能二次修改
public static readonly DependencyProperty ValueProperty;
//注册依赖属性
static property()
{
//基本类型:属性名称 属性类型 所属类型
//默认值要跟属性类型严格一致
//委托回调方法参数
ValueProperty = DependencyProperty.Register(
"value",
typeof(double),
typeof(property),
new PropertyMetadata(0.0 ,
new PropertyChangedCallback(OnValueChanged),
//强制回调
new CoerceValueCallback(OnCoerceValue)),
//值验证回调
new ValidateValueCallback(OnValidateValue)
);
}
//属性值变化回调,处理的是属性值的变化
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//如果调用成功,这里将知道对应的依赖属性值发生了变化
//d:属性所在对象
//e:属性变化前后的值
//e.NewValue
//e.OldValue
//这是通过实例访问
(d as property).Refresh();
}
//值验证调用
private static bool OnValidateValue(object v)
{
// 验证属性值是否合法
// 返回 true 表示合法
// 返回 false 表示不合法
if ((double)v > 2000)
{
return false;
}
return true;
}
//强制回调
private static object OnCoerceValue(DependencyObject d, object baseValue)
{
//强制回调,可以对属性值进行强制处理
//返回值就是最终的属性值
if ((double)baseValue > 2000)
{
return 2000.0;
}
return baseValue;
}
private void Refresh()
{
//刷新界面
}
public double value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public property()
{
this.id=0;
var v = this.GetValue(ValueProperty);
this.Loaded += (se, ev) =>
{
this.SetValue(ValueProperty, 11.0);
this.value = 11.0;
this.value = 11.0;
this.SetValue(ValueProperty, 11.0);
};
}
}
}