【问题标题】:About DependencyProperty in WPF关于 WPF 中的 DependencyProperty
【发布时间】:2016-02-10 08:25:37
【问题描述】:

我对 WPF 很陌生,在学习(特别是创建用户控件)时,我偶然发现了这个叫做“DependencyProperty”的东西。

我了解它在代码中的工作原理,但是当我可以创建一个属性并将其公开以供公众使用时,我们为什么以及何时需要它。

例子:

XAML:

<UserControl.....>
<StackPanel Orientation="Vertical">
<TextBlock x:Name="label" Text="Hello"/>
<TextBlock x:Name="text" Text="World!" />
</StackPanel>
</UserControl>

CS 文件:

public partial SampleUserCtrl : UserControl
{
public string LabelText { get { return this.label.Text; } set { this.label.Text = value; } }
public string TextBoxText { get { return this.text.Text; } set { this.text.Text = value; } }
}

【问题讨论】:

  • 如果你看一下 SO 上的dependency-properties 标签,你会发现它'支持数据绑定,包括样式、继承、动画和默认值。它允许您在 DependencyObject' 上设置附加属性。例如,它们允许您在任何元素上设置Grid.ColumnGrid.Row 属性,因此周围的Grid 可以正确定位它们。如果没有依赖属性,您必须为每个可能的 UI 元素添加 ColumnRow 属性,这是不可行的。
  • 依赖属性属性。唯一真正的区别是您可以在 XAML 或代码中使用具有依赖属性的数据绑定和更改通知。你不能用“普通”属性来做到这一点。
  • 在 StackOverflow 上提问之前请先做一些研究。开始阅读 MSDN 上的在线文档:Dependency Properties Overview
  • 自从我发布这个问题以来已经有一段时间了.. 花了一些时间阅读有关数据绑定等的内容。我现在了解它的目的并感谢在这里发布的每个人。由于我不能接受以下所有答案,因此我将投票代替:D

标签: wpf dependency-properties


【解决方案1】:

WPF 中的DependecyProperty 有不同的用途。

与普通 .NET 属性相比的优势

减少内存占用 当你认为一个 UI 的 90% 以上的属性时,每个属性 控制通常保持在其初始值。依赖属性 通过仅将修改后的属性存储在 实例。默认值在依赖项中存储一次 属性。

值继承当您访问依赖属性时,值是 通过使用价值解决策略来解决。如果没有本地值 设置,依赖属性向上导航逻辑树,直到它 找到一个值。当您在根元素上设置 FontSize 时 适用于下面的所有文本块,除非您覆盖该值。

更改通知依赖属性具有内置更改 通知机制。通过在属性中注册回调 当属性的值已被通知时,您会收到元数据 改变了。这也被数据绑定使用。

当您深入了解 WPF 时,您还会偶然发现 DataBinding 和面向对象的设计模式,例如 MVVMMVPVM。两种模式都依赖于通过使用依赖属性实现的 DataBinding。如果它不是依赖属性,则不能执行数据绑定。

基本上,通过依赖属性的数据绑定允许用户在通过代码更新值时更新视图。

例如:在 Windows 窗体中,为了更新标签文本,您可以在后面的代码中分配其值,如下所示:

lbl1.Text = "foo";

在 XAML(视图)中绑定的数据绑定中

<label Text = "{Binding foo}"></label> 

并更新后面代码中的值:

foo = "foo";

我自己不是专家,如果我可能听起来令人困惑,很抱歉。

【讨论】:

    【解决方案2】:

    依赖属性比普通属性有很多好处。

    • 可以通过引用资源来设置依赖属性值
    • 它可以通过数据绑定来引用一个值
    • 可以设置动画。当一个动画 已应用并正在运行,动画值以较高的速度运行 优先于该属性的任何值(例如本地值) 否则有。

    您可以通过msdn了解更多信息。

    【讨论】:

      【解决方案3】:

      DP 属性的主要优点是你可以在 DP 中找到任何东西,比如你的控制信息和你当前的 DataContext 信息。

       public string MyProperty
          {
              get { return (string)GetValue(MyPropertyProperty); }
              set { SetValue(MyPropertyProperty, value); }
          }
      
          // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
          public static readonly DependencyProperty MyPropertyProperty =
              DependencyProperty.Register("MyProperty", typeof(string), typeof(MyUserControl), new PropertyMetadata(null, (s, e) => OnChangedValue(s, e)));
      
          private static void OnChangedValue(DependencyObject s, DependencyPropertyChangedEventArgs e)
          {
              throw new NotImplementedException();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多