简介:
DependencyObject 类表示参与依赖属性系统的对象。属性系统的主要功能是计算属性的值,并提供有关已更改的值的系统通知。 参与属性系统的另一个类 DependencyProperty。 DependencyProperty 允许将依赖属性注册到属性系统,并提供有关每个依赖属性的标识和信息,而 DependencyObject 为基类,使对象能够使用此依赖属性。
INotifyPropertyChanged 类用于通知UI刷新,注重的仅仅是数据更新后的通知。DependencyObject 类用于给UI添加依赖和附加属性,注重数据与UI的关联。如果简单的数据通知,两者都可以实现的。
介绍:
- 依赖属性。 通过调用 Register 方法,并将该方法的返回值存储为类中的公共静态字段,来注册依赖属性。
- 附加属性。 通过调用 RegisterAttached 方法,并将该方法的返回值存储为类中的公共静态只读字段,来注册附加属性。
- 获取、设置和清除 DependencyObject上存在的任何依赖项属性的值的实用工具方法。
- 元数据、强制值支持、属性更改通知和替代依赖属性或附加属性的回调。 此外,DependencyObject 类简化了依赖属性的每个所有者的属性元数据。
- 是 ContentElement、Freezable或 Visual派生类的基类。
使用:
通过TextBox的Text数据改变TextBlock的字体。
输入“propdp”,按“Tab”键会自动生成。
public class PersonDP : DependencyObject
{
public int MyFont
{
get { return (int)GetValue(MyFontProperty); }
set { SetValue(MyFontProperty, value); }
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyFontProperty =
DependencyProperty.Register("MyFont", typeof(int), typeof(PersonDP),
new PropertyMetadata((int)20,
new PropertyChangedCallback(OnValueChanged),
new CoerceValueCallback(OnValueCallback)),
new ValidateValueCallback(OnValidateValue));
//首先数据验证
private static bool OnValidateValue(object value)
{
return (int)value != 0;
}
//其次数据改变
private static object OnValueCallback(DependencyObject d, object baseValue)
{
if((int)baseValue > 200) { baseValue = 200; }
return baseValue;
}
//最后数据回调
private static void OnValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
MessageBox.Show("Font Size: " + e.NewValue.ToString());
}
}
<Window.Resources>
<local:PersonDP x:Key="p"></local:PersonDP>
</Window.Resources>
<Grid>
<StackPanel>
<TextBox x:Name="tbx" Text="{Binding Source={StaticResource p},Path=MyFont,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBlock Text="{Binding ElementName=tbx,Path=Text}" FontSize="{Binding ElementName=tbx,Path=Text}" ></TextBlock>
</StackPanel>
</Grid>
结果: