经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
【译】为什么命名“它”为依赖属性(DependencyProperty)
来源:cnblogs  作者:czwy  时间:2023/10/13 8:41:12  对本文有异议

当我们创建新的类和成员时,我们花费了大量的时间和精力是它们尽可能的好用,好理解,好发现。通常我们会遵循.Net框架设计指南,尤其是会不断地研究这个新类与其他类,未来计划等内容之间的关系。

当命名依赖属性(DependencyProperty)和依赖对象(DependencyObject)的时候也是遵循这个原则,仅仅讨论如何命名,我们就大概花了几个小时。依赖属性(DPs)最终归结为属性计算和依赖的跟踪。属性计算并不是很特别,很多属性都是这样的,所以DP的本质特征就是依赖的跟踪,因此命名为依赖属性。

这里有一个例子,实际上是一段示例代码,显示了几个依赖跟踪的例子:

  1. <StackPanel DataContext="Hello, world" TextBlock.FontSize="22">
  2. <StackPanel.Resources>
  3. <Style TargetType="TextBlock">
  4. <Setter Property="FontWeight" Value="Bold" />
  5. <Style.Triggers>
  6. <Trigger Property="IsMouseOver" Value="True">
  7. <Setter Property="Background" Value="Red" />
  8. </Trigger>
  9. </Style.Triggers>
  10. </Style>
  11. </StackPanel.Resources>
  12. <TextBlock Text="{Binding}" />
  13. </StackPanel>

代码示例中TextBlock的属性有不少依赖:

  • TextBlock.Text依赖于绑定(Binding),而这里的绑定(Binding)依赖于DataContextDataContext是从父元素StackPanel继承下来的,因此,TextBlock.Text也依赖于树的形状;如果TextBlockStackPanel移除,StackPanel的值也会发生变化。
  • TextBlock.FontSize也依赖于树。在这里,你可以看到它从StackPanel继承。
  • 所有的TextBlock属性都依赖于TextBlock.style。例如,这里是TextBlock.FontWeight来自样式(Style)。
  • 同样的,TextBlock.Background也依赖样式(Style)。但在这个示例中,它在触发器(Trigger)中设置。所以TextBlock.Background在这种情况下也取决于TextBlock.IsMouseOver

有时,如果编写自己的依赖属性,则需要在跟踪依赖项上做一些辅助。当需要重新计算属性时,可以通过调用InvalidateProperty来实现,通常是因为在CoerceValueCallback中引用了它。

例如,这里有一个名为Foo的依赖属性和一个名为FooPlus1的只读依赖属性。FooPlus1只是有一个计算“Foo+1”的CoerceValueCallback。因此,Foo有一个PropertyChangedCallback,当Foo发生变化时,它会使FooPlus1失效。

  1. public int Foo
  2. {
  3. get { return (int)GetValue(FooProperty); }
  4. set { SetValue(FooProperty, value); }
  5. }
  6. // Using a DependencyProperty as the backing store for Foo. This enables animation, styling, binding, etc...
  7. public static readonly DependencyProperty FooProperty =
  8. DependencyProperty.Register("Foo", typeof(int), typeof(Window1), new PropertyMetadata(FooChangedCallback));
  9. static void FooChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs args)
  10. {
  11. // Whenever Foo changes, we need to invalidate FooPlus1, so that
  12. // the DependencyProperty system knows to update it (call its
  13. // CoerceValueCallback again).
  14. (d as Window1).InvalidateProperty(Window1.FooPlus1Property);
  15. }
  16. public int FooPlus1
  17. {
  18. get { return (int)GetValue(FooPlus1Property); }
  19. }
  20. static readonly DependencyPropertyKey FooPlus1PropertyKey =
  21. DependencyProperty.RegisterReadOnly("FooPlus1", typeof(int), typeof(Window1), new PropertyMetadata(0, null, CoerceFooPlus1Callback));
  22. static readonly DependencyProperty FooPlus1Property = FooPlus1PropertyKey.DependencyProperty;
  23. static object CoerceFooPlus1Callback(DependencyObject d, object baseValue)
  24. {
  25. return (d as Window1).Foo + 1;
  26. }

原文链接:https://learn.microsoft.com/en-us/archive/blogs/mikehillberg/why-is-it-called-a-dependencyproperty

原文链接:https://www.cnblogs.com/czwy/p/17760688.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号