依赖属性简述
继承特性,父元素的依赖属性可被子元素所继承DataContext、FontSize、Background在父元素设置依赖属性时,如果子元素没有设置与其相同的依赖属性,子元素就会继承父元素依赖属性的值,例如 1 2 3 4 5 6 7 8 <Window Title="MainWindow" Height="300" Width="300" FontSize="24"> <StackPanel> <TextBlock Text="字号改变" Margin="5" TextWrapping="Wrap" HorizontalAlignment="Center"/> <TextBlock Text="字号改变" Margin="5" TextWrapping="Wrap" HorizontalAlignment="Center"/> <TextBlock Text="字号改变" Margin="5" TextWrapping="Wrap" HorizontalAlignment="Center"/> <Button Padding="5" Content="按下改变字号" Margin="5" Click="Button_Click" HorizontalAlignment="Center"/> </StackPanel> </Window>
由于Window设置了依赖属性FontSize,而其子元素都没有设置,所以由于继承性TextBlock和 Button会继承Window的FontSize属性的值。
值的自动验证和动态调整 属性变动通知 自定义依赖属性 注册依赖项属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //要定义依赖属性时,必须定义一个静态的只读的DependencyProperty的字段,该字段其实就是Register的返回值,MyValueProperty其实就是依赖项属性 static保持其属性信息始终可用,并且共享这些信息,readonly保持属性不可修改 public static readonly DependencyProperty MyValueProperty = DependencyProperty.Register( "MyValue", //依赖属性名 typeof(int), //数据类型 typeof(DependencyPropertyClass), //依赖属性的宿主类型 new PropertyMetadata (100, //默认值 //属性值改变时的回调方法,d为依赖属性,e为属性改变时触发的事件 (d, e) => { MessageBox.Show("调用PropertyChangedCallback委托:Property:" + e.Property + ",OldValue:" + e.OldValue + ",NewValue:" + e.NewValue); }, //用于动态调整值得回调方法,value为依赖属性的值 (d, value) => { int newValue = (int)value + 1; MessageBox.Show("调用CoerceValueCallback委托,原值:" + value + "新值:" + newValue); return newValue; } ));
添加属性包装器 1 2 3 4 5 public int MyValue { get { return (int)GetValue(MyValueProperty); }//依赖属性获取值的方式GetValue set { SetValue(MyValueProperty, value); }//依赖属性设置值的方式SetValue }
包装器的作用是让依赖属性能用.Net属性使用的方式使用
在主程序使用用户控件的依赖属性 1 2 3 4 5 6 7 8 <Window xmlns:local="clr-namespace:DependencyPropertyDemo" Title="MainWindow" Height="300" Width="300" FontSize="24"> <StackPanel> <local:MyDPUserControl x:Name="myDP"/> <Label Content="{Binding ElementName=myDP, Path=MyValue}" HorizontalAlignment="Center"/> <Button Click="Button_Click_1" HorizontalAlignment="Center" Height="40" Content="按下改变MyValue的值"/> </StackPanel> </Window>
3)依赖属性应用于数据绑定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <Window.Resources> <local:MyWPFClass x:Key="MyWPFClassObject"/> </Window.Resources> <StackPanel Margin="10" HorizontalAlignment="Center" DataContext="{StaticResource MyWPFClassObject}"> <TextBlock Text="滚动条和文本标签都直接绑定到一个MyWPFClass对象的MyValue属性实现同步"/> <ScrollBar Maximum="100" Minimum="0" Width="300" Background="DeepPink" Orientation="Horizontal" Margin="10" Value="{Binding MyValue}" LargeChange="10" SmallChange="1" HorizontalAlignment="Center"/> <TextBlock Margin="10"> <Run>MyWPFClassObject.MyValue=</Run> <Run FontSize="20" Foreground="Red" Text="{Binding Path=MyValue}"/> </TextBlock> </StackPanel>
依赖属性的自动调整特性
PropertyChangedCallback:当值改变时,此函数被调用
CoerceValueCallback:用于调整输入值
参考文献:WPF编程宝典