【问题标题】:XAML Dependency Property vs Regular PropertiesXAML 依赖属性与常规属性
【发布时间】:2015-08-25 22:23:53
【问题描述】:

如果我有这个:

    public class BoardCalc : FrameworkElement
    {
        public BoardCalc()
        {
            this.Loaded += BoardCalc_Loaded;
        }

        void BoardCalc_Loaded(object sender, RoutedEventArgs e)
        {
            Boards = Math.Floor(LengthRequired / 16);
            BoardsRequired2 = Math.Floor(LengthRequired / 16);
        }

        public Double LengthRequired { get; set; }

        private Double _Boards;
        public Double Boards
        {
            get
            {
                return _Boards;
            }
            set
            {
                _Boards = value;
            }
        }


        //public Double Boards
        //{
        //    get { return (Double)GetValue(BoardsProperty); }
        //    set { SetValue(BoardsProperty, value); }
        //}

        //// Using a DependencyProperty as the backing store for Boards.  This enables animation, styling, binding, etc...
        //public static readonly DependencyProperty BoardsProperty =
        //    DependencyProperty.Register("Boards", typeof(Double), typeof(BoardCalc), null);

        public Double BoardsRequired2
        {
            get { return (Double)GetValue(BoardsRequired2Property); }
            set { SetValue(BoardsRequired2Property, value); }
        }

        // Using a DependencyProperty as the backing store for BoardsRequired2.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty BoardsRequired2Property =
            DependencyProperty.Register("BoardsRequired2", typeof(Double), typeof(BoardCalc), null);



    }

我这样做:

 <StackPanel xmlns:Boards="clr-namespace:BoardsUtil" >
             <Boards:BoardCalc x:Name="boardCalc1"
                LengthRequired="5280"  />

             <TextBlock Text="{Binding ElementName=boardCalc1, Path=Boards}" />

             <TextBlock Text="{Binding ElementName=boardCalc1, Path=BoardsRequired2}" />

         </StackPanel>

两部分问题:

  1. 当我使用依赖属性时,Boards 值将在设计器中计算并显示 330 个板。如果我使用常规属性,它在设计时将为 0。在运行时,任何一个都可以工作。这是我们所期望的吗?如果是这样,或者如果不是,有人可以向我解释为什么会这样,这样我就可以解决它并检查我的其余代码是否实际工作。

  2. 我应该使用 LengthRequired 的依赖属性吗?如果你从 XAML 设置一个属性,你应该使用依赖是吗?但是,如果您只是绑定到 XAML 中的属性,您可以使用常规属性吗?这是我们在这里看到的行为吗?这是我们所期望的吗?不?是的?为什么,所以我可以决定要做什么。

【问题讨论】:

    标签: wpf xaml properties dependency-properties


    【解决方案1】:

    使用依赖属性的主要原因是允许底层子系统提供额外的基于 UI/XAML/WPF 的功能,即:

    1) 绑定。 在这段代码中:

    <Slider x:Name="slid1" Maximum="5280" Minimum="16" Value="250" />
    <Boards:BoardCalc x:Name="boardCalc1"
                LengthRequired="{Binding ElementName=slid1,Path=Value"  />
    

    LengthRequired 必须是依赖属性。你可以像这样设置 LengthRequired

    LengthRequired = "5280"
    

    你可以这样做

    Text={Binding ElementName=boardCalc1, Path=LengthRequired} ...
    

    但你不能设置 LengthRequired 使用绑定扩展。

    2) 动画 3) 造型

    基本原理相同。要允许底层 UI 子系统从 0 到 100 或其他动画,或者让子系统选择样式和主题等,它必须是一个依赖属性。

    1,2,3。使用依赖属性的原因。 对于常规属性,您可以插入 INotify。

    【讨论】:

      【解决方案2】:

      板值将在设计器中计算

      引用 MSDN (Dependency Property Overview)

      依赖属性的目的是提供一种计算方法 基于其他输入值的属性值。

      设计模式不是运行时模式,设计器使用依赖属性,因为它专门为它们反映。设计器没有订阅 INotifyPropertyChanged,也没有像依赖属性那样与普通属性交互。

      我应该为 LengthRequired 使用依赖属性吗?

      我会对其进行通知属性更改,但除非您正在创建自定义控件,否则使用 Dependency 属性是矫枉过正的。

      如果你从 XAML 设置一个属性,你应该使用依赖是

      不,可以绑定(设置)到 XAML 中的任何属性,因为它只是反射。绑定通过提供的 route(路径信息)反映数据上下文中的项目。

      但是绑定的行为不同于在绑定之后发生的获取数据的行为

      但是,如果您只是绑定到 XAML 中的属性,您可以使用常规属性吗?

      是的,但在大多数情况下,使用 INotifyPropertyChanged 操作来帮助绑定和检索数据。


      使用这些基本规则

      • 在控件上使用依赖属性,因为它们在控件使用者的设计模式下是可识别的。否则用户需要查找属性,无法在 XAML 中设置值;不像依赖属性。
      • 可以绑定任何属性,但发生的更改可能不会电报到它所绑定的任何东西...要提供该过程的良好数据,请使用INotifyPropertyChanged 操作。李>

      【讨论】:

      • 其实添加INotifyPropertyChanged的实现确实会影响设计器。它现在与 DependencyProperty 具有相同的值。
      • 您能否进一步描述它们 [依赖属性] 如何“在设计模式下可识别”。或者用户需要如何“找到”该属性。或“无法设置属性”。 ??
      • @AndyzSmith 你的最终目标是什么?设计期间的工作版本?设计师做它该做的,并且可以在屏幕上显示数据直到某个点。如果一个是创建一个控件使用依赖属性,如果一个不是使用普通属性。
      • 为什么要使用依赖属性?您可以从 XAML 设置常规属性。您可以从 XAML 绑定到常规属性。您可以通过快速 INotify 让设计器使用常规属性。
      • @AndyzSmith 依赖属性的主要原因,因为它们是静态的,所以允许未启动的控件来表达属性。当一个人在设计并在设计表面上放置一个控件时,可以更改诸如WidthHeightText 之类的东西,因为这些东西是作为依赖属性公开的。该控件具有非依赖属性,但不会向用户显示这些属性。否则,如果没有 DP,就只能在代码隐藏中连接控件。因此,任何控件都应将面向公众的属性公开为 DP,以允许在 XAML 中进行连接。 HTH
      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2014-01-09
      • 1970-01-01
      • 2013-05-25
      • 2012-02-12
      • 2023-03-13
      相关资源
      最近更新 更多