加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

WPF中的依赖属性使用

发布时间:2020-12-13 20:46:27 所属栏目:百科 来源:网络整理
导读:我很难找出依赖属性的正当理由.为什么System.Controls.TextBox“Text”属性是依赖属性而不是普通属性?作为依赖财产有什么好处? 我想要完成的一件事是向我的UserControl添加一个ValidationRules属性,该属性将包含其他验证规则.像这儿: customControls:Requ
我很难找出依赖属性的正当理由.为什么System.Controls.TextBox“Text”属性是依赖属性而不是普通属性?作为依赖财产有什么好处?

我想要完成的一件事是向我的UserControl添加一个ValidationRules属性,该属性将包含其他验证规则.像这儿:

<customControls:RequiredTextBox.ValidationRules>
                        <validators:NotNullOrEmptyValidationRule ErrorMessage="FirstName cannot be null or empty"/>
                    </customControls:RequiredTextBox.ValidationRules>

问题是我不确定ValidationRules属性是DependencyProperty还是普通属性.

上面的代码给出了以下错误:

{"Cannot add element to 'ValidationRules'; the property value is null.  Error at object 'LearningWPF.ValidationRules.NotNullOrEmptyValidationRule' in markup file 'LearningWPF;component/addcustomerwindow.xaml' Line 35 Position 66."}

这是ValidationRules属性:

public static readonly DependencyProperty ValidationRulesProperty =
            DependencyProperty.Register("ValidationRules",typeof (Collection<ValidationRule>),typeof (RequiredTextBox),new FrameworkPropertyMetadata(null)); 

        public Collection<ValidationRule> ValidationRules
        {
            get { return (Collection<ValidationRule>)GetValue(ValidationRulesProperty); }
            set { SetValue(ValidationRulesProperty,value); }
        }
好处主要有两个方面:

首先,依赖属性仅在使用时创建,这意味着TextBox类可以非常高效,内存占用少,因为它具有占用堆空间的最小数量的真实属性.这在WPF中尤为重要,因为所有控件都只是越来越多特定类型的集合.如果这些内部类型中的每一个都声明了数十个属性来定义行为,那么像按钮这样的高级控件最终将具有类的大小,其中包含一百个属性的大概.

其次,依赖属性可以绑定到除为其创建的类型之外的对象.这允许控件可以设置Grid.Column属性的情况,Grid控件可以读取该属性并用于布局.这意味着我们没有数百个装饰器类提供其他控件所需的微小功能.这意味着xmal更直观,更易读.

编辑以解决修订后的问题中的示例:

虽然你的验证属性不会从作为依赖属性获得很多好处(基本上是出于所有答案中的原因,到目前为止我只能真正看到我对内存占用的评论),这当然不是有利的因为在您可能想要绑定它的文本框的Text属性的情况下,或者基于其他输入更改它,我仍然将它实现为依赖属性.我的理由很简单;你没有获得太多收益,但它也不会花费你任何东西 – 我从来没有希望我在自定义控件中使用了基本属性,而当我第一次开始编写它们时,我不断地将我的基本属性升级为依赖项,因为我想要一些额外的功能.

简单地说,虽然依赖属性更复杂,以定义普通属性,我仍然会将其用作WPF控件的事实标准,除非有一些很好的理由不这样做.与属性是类的标准的方式大致相同,即使字段更容易实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读